Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1084 → Rev 1085

/demos/branches/pj/orbit/orbit.c
0,0 → 1,344
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: orbit.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:45 $
------------
*/
 
/*
* Copyright (C) 2000 Giorgio Buttazzo and Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/****************************************************************/
/* SIMULAZIONE DI MASSE CHE ORBITANO */
/****************************************************************/
 
#include <kernel/kern.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <semaphore.h>
#include <stdlib.h>
#include <math.h>
 
#define MAX 11 /* numero massimo pianeti */
#define ESC 27 /* codice ASCII tasto ESCAPE */
#define XMAX 639 /* valore massimo coordinata X */
#define YMAX 479 /* valore massimo coordinata Y */
 
struct coord {
double x;
double y;
};
 
char fbuf[1000]; // buffer for reading a file
int flen; // file length
 
double mass[MAX]; /* vettore masse pianeti */
struct coord pos[MAX]; /* vettore posizioni attuali */
struct coord vel[MAX]; /* vettore velocita' iniziali */
 
int XGS, YGS; /* Coordinate centro spazio */
int RP, RT; /* raggio pianeta, raggio Terra */
int np; /* numero attuale di pianeti */
double G; /* Gravitazione Universale */
double tick; /* tick di sistema */
double delta; /* incremento temporale */
double scala; /* fattore grafico di scala */
 
// -------------------------------------------------------
// NOTA: %f o %lf significa double e %nf significa float
// -------------------------------------------------------
 
PID pid;
int period; /* task period */
int wcet; /* task wcet */
sem_t mutex; /* semaforo di mutua esclusione */
 
 
void get_par(void);
 
/*--------------------------------------------------------------*/
 
void my_fine(void *arg)
{
grx_close();
}
 
/*--------------------------------------------------------------*/
 
int inside(int x, int y)
{
return ((x > RP) && (x < XMAX-RP) &&
(y > RP) && (y < YMAX-RP));
}
 
/*--------------------------------------------------------------*/
 
TASK massa(void *xxx)
{
int i = (int)xxx; /* parametro del task */
int gx, gy; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int j;
int r, col; /* raggio e colore pianeta */
double dt; /* incremento temporale */
double dist=0.0, dx, dy; /* distanze pianeta-pianeta */
double dist0=0.0; /* distanze pianeta-Terra */
double x, y; /* posizione del pianeta */
double vx, vy; /* velocita' del pianeta */
double ax, ay; /* accelerazione del pianeta */
double k; /* variabile ausiliaria */
double arg; /* variabile di appoggio */
 
x = pos[i].x; y = pos[i].y;
vx = vel[i].x; vy = vel[i].y;
ox = XGS + x / scala;
oy = YGS + y / scala;
dt = delta;
 
do {
x = pos[i].x;
y = pos[i].y;
ax = ay = 0.0;
for (j=0; j<np; j++) {
if (j != i) {
dx = pos[j].x - x;
dy = pos[j].y - y;
arg = dx*dx + dy*dy;
dist = sqrt(arg);
if (dist < RP*scala) dist = RP*scala;
k = G * mass[j] / (dist*dist*dist);
ax += k * dx;
ay += k * dy;
}
if (j == 0) dist0 = dist - (RP+RT)*scala;
}
x += vx*dt + 0.5*ax*dt*dt;
y += vy*dt + 0.5*ay*dt*dt;
vx += ax * dt;
vy += ay * dt;
 
gx = XGS + x / scala;
gy = YGS + y / scala;
 
r = RP;
col = i + 1;
 
sem_wait(&mutex);
grx_disc(ox,oy,r,0);
grx_disc(gx,gy,r,col);
sem_post(&mutex);
 
pos[i].x = x; pos[i].y = y;
ox = gx; oy = gy;
 
task_endcycle();
 
} while ((dist0 > 0) && inside(gx,gy));
 
sem_wait(&mutex);
grx_disc(ox,oy,r,0);
grx_disc(XGS,YGS,RT,12);
grx_circle(XGS,YGS,RT,14);
sem_post(&mutex);
 
return NULL;
}
 
/*--------------------------------------------------------------*/
/* MAIN */
/*--------------------------------------------------------------*/
 
TASK main()
{
HARD_TASK_MODEL m;
char c; /* carattere letto da tastiera */
 
set_exchandler_grx();
sys_atrunlevel(my_fine, NULL, RUNLEVEL_BEFORE_EXIT);
 
sem_init(&mutex,0,1);
 
get_par();
keyb_getch(BLOCK);
 
grx_init();
grx_open(640, 480, 8);
 
grx_disc(XGS,YGS,RT,12);
grx_circle(XGS,YGS,RT,14);
 
np = 0;
 
do {
if (np < MAX-1) {
np++;
hard_task_default_model(m);
hard_task_def_arg (m, (void *)np);
hard_task_def_wcet (m, wcet);
hard_task_def_mit (m, period);
hard_task_def_usemath (m);
pid = task_create("massa", massa, &m, NULL);
if (pid == NIL) {
grx_close();
perror("Could not create task");
c = keyb_getch(BLOCK);
sys_abort(1);
}
task_activate(pid);
}
c = keyb_getch(BLOCK);
 
} while (c != ESC);
 
sys_end();
 
return 0;
}
 
/*------------------------------------------------------*/
/* file reading */
/*------------------------------------------------------*/
 
void read_file(void)
{
int err;
DOS_FILE *fp;
 
fp = DOS_fopen("orbit.dat","r");
 
if (!fp) {
err = DOS_error();
cprintf("Error %d opening myfile.txt...\n", err);
flen = 0;
return;
}
 
flen = DOS_fread(&fbuf, 1, 1000, fp);
cprintf("Read %d bytes from orbit.dat\n", flen);
 
DOS_fclose(fp);
}
 
/*------------------------------------------------------*/
/* get data from buffer */
/*------------------------------------------------------*/
 
void get_par(void)
{
int x = 0;
int i;
double vx, vy;
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &period);
cprintf("period = %d\n", period);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &wcet);
cprintf("wcet = %d\n", wcet);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &delta);
cprintf("delta = %f\n", delta);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &scala);
cprintf("scala = %f\n", scala);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &G);
cprintf("G = %20.15f\n", G);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &RP);
cprintf("RP = %d\n", RP);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &RT);
cprintf("RT = %d\n", RT);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &XGS);
cprintf("XGS = %d\n", XGS);
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &YGS);
cprintf("YGS = %d\n", YGS);
 
for (i=0; i<MAX; i++) {
while ((fbuf[x] != ':') && (x < flen)) x++;
x++; x++;
sscanf(&fbuf[x], "%f", &mass[i]);
 
while ((fbuf[x] != '\t') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &vx);
 
while ((fbuf[x] != '\t') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &vy);
pos[i].x = vx; pos[i].y = vy;
 
while ((fbuf[x] != '\t') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &vx);
 
while ((fbuf[x] != '\t') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%f", &vy);
vel[i].x = vx; vel[i].y = vy;
 
cprintf("mass[%d] = %f\t", i, mass[i]);
cprintf("pos: %f, %f\t", pos[i].x, pos[i].y);
cprintf("vel: %f, %f\n", vel[i].x, vel[i].y);
}
}
 
/*--------------------------------------------------------------*/
 
/demos/branches/pj/orbit/initfile.c
0,0 → 1,124
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:45 $
------------
 
System initialization file
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a CBS (Costant Bandwidth Server) level
a Dummy level
 
It can accept these task models:
 
HARD_TASK_MODEL (wcet+mit) at level 0
SOFT_TASK_MODEL (met, period) at level 1
NRT_TASK_MODEL at level 2
 
This file is similar to the configuration of kernel/init/hartik3.c
 
TICK is set to 0 (one-shot timer is used)
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
void read_file();
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(0);
CBS_register_level(0, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
read_file();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/demos/branches/pj/orbit/orbit.dat
0,0 → 1,21
----------------------------------------------------
period: 10000 wcet: 100
delta: 1. scala: 150.
G: 6.6e-15
r_pianeta: 4 r_Terra: 8
X_centro: 320 Y_centro: 240
 
------------------- pianeti ------------------------
massa pos.x pos.y vel.x vel.y
0: 6.0e21 0. 0. 0. 0.
1: 1.0e21 10000. 8000. -60. 0.
2: 1.0e8 5000. 0. 0. 80.
3: 5.0e18 10000. 8000. -50. 0.
4: 1.0e9 10000. 8000. -40. 20.
5: 1.0e15 1000. 5000. -80. 0.
6: 1.0e5 1000. 5000. -80. 0.
7: 1.0e17 1000. 5000. -80. 0.
8: 1.0e5 1000. 5000. -80. 0.
9: 1.0e5 1000. 5000. -80. 0.
10: 1.0e5 1000. 5000. -80. 0.
----------------------------------------------------
/demos/branches/pj/orbit/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= orbit
 
include $(BASE)/config/example.mk
 
orbit:
make -f $(SUBMAKE) APP=orbit INIT= OTHEROBJS="initfile.o" OTHERINCL=
 
/demos/branches/pj/thdemo/fft.c
0,0 → 1,533
// FFT Part
/*
 
FFTPlay 1.0
-----------
 
This application reads data from the audio microphone and then put it
to the screen in a graphical oscilloscope-like form (both standard Hartik
SB driver and Alsa driver can be used).
 
The application also calculate a FFT on the latest values, and displays
the power spectrum in tho ways, one like an equalizator, and the other in a
2D form.
 
A resolution of 1024x768, 64K colors is used.
 
The task set is composed by these tasks and functions:
 
Self buffering functions (SB only)
----------------------------------
this function takes the samples read by the mic and then makes a window
with the last WINDATA_NSAMPLES samples. The window is then put in
the CAB windata.
 
Task raw and task mixer (ALSA only)
-----------------------------------
These tasks are used with the Alsa driver; because it doesn't support the
self-buffering mode, we have to do a forever cycle in witch we have to read
all the data. Then the data are managed like the self-buffering functions of
the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
the window.
(This approach is not good for realtime...)
 
Task wave
---------
This task read the last window and then put it on the screen in a wave form
on the top of the screen.
The task's period is set to 40 ms (25 fps).
 
Task fft
--------
This task read the last window and then it computes the FFT.
With the FFT data it computes the power spectrum, whitch is sent to the
CAB pwrdata.
The task's period is set to 10 ms (good for the 2D story task).
This task is the only Hard Task.
 
Task equ
--------
This task read the last power spectrum and displays it in a graphical
form, like a hi-fi equalizator.
The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
The task's period is set to 40 ms (25 fps).
 
Task equ2D
----------
This task read the lasf power spectrum and displays it in a graphical
one-line form. Each pixel is a power coefficient, and its colour shade
from black (no power) to red (high power) passing through green and blue.
The task display the last EQU2D_WIDTH power lines.
The task's period is set to 10 ms (good for the 2D story task).
 
****************************************************************************
TASK LOAD
****************************************************************************
 
period wcet
task tick (ms) us %
--------------------------------------------------------
sound driver 24->3 12->1.5 200 0.016->0.133
wave 80 40 11500 0.2875
fft 20 10 3000 0.3000
equ 80 40 7000 0.1750
equ2D 20 10 500 0.0500
-------------
0.812 (last 4)
*/
 
#include "demo.h"
//#include <ll/ll.h>
 
//#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
 
#include <modules/cabs.h>
 
//#include <string.h>
//#include <stdlib.h>
#include <semaphore.h>
 
//#include <drivers/keyb.h>
//#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <ports/rfftw.h>
 
/* CAB ports... */
CAB cab_windata; /* a window on the last WINDATA_DIM samples */
CAB cab_pwrdata; /* the last power spectrum */
 
/* for the cab_windata */
typedef struct {
int start;
SAMPLE sample[WINDATA_NSAMPLES];
} window;
 
/* for the cab_pwrdata */
typedef struct {
fftw_real p[PWR_NSAMPLES];
} power;
 
 
// win is global... because is used by raw_infun...
window win;
 
/*
This is the self-buffering function: read the samples and put their mean
value in a CAB
*/
int raw_infun(void *b)
{
int i;
char *w;
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<rawdata_nsamples/2; i++) {
win.sample[win.start] = audiobuf[i];
win.start = (win.start+1) % WINDATA_NSAMPLES;
}
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
 
#if defined(NO_GRX)
cprintf("X"); //"XXX%d\n",win.sample[win.start]);
#endif
return 0;
}
 
 
 
void init_rawdata()
{
int i;
char *w;
 
win.start = 0;
for (i=0; i<WINDATA_NSAMPLES; i++)
win.sample[i] = 0;
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
}
 
 
 
 
 
TASK wave_task()
{
window *p;
int x,y;
int s;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
 
/* let's print the wave */
mutex_lock(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,white);
}
mutex_unlock(&mutex);
 
task_endcycle();
 
/* let's erase the wave */
mutex_lock(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,black);
}
mutex_unlock(&mutex);
 
cab_unget(cab_windata,(char *)p);
 
}
}
 
 
rfftw_plan plan;
 
void fft_close(void *arg)
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task()
{
fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
power power_spectrum;
 
#if defined(NO_GRX)
fftw_real max = 0.0;
#endif
 
char *m;
 
int k, i;
 
window *p;
 
plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
 
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
while(1)
{
/* Let's prepare the intput FFT data */
p = (window *)cab_getmes(cab_windata);
 
for (k = 0, i = p->start;
k < FFT_NSAMPLES;
k++, i = (i+1)%WINDATA_NSAMPLES)
in[k] = p->sample[i]/FFT_SCALE;
 
cab_unget(cab_windata,(char *)p);
 
/* zero-padding if needed */
for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
in[k] = 0.0;
 
rfftw_one(plan, in, out);
 
/* power spectrum computation */
power_spectrum.p[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
if (FFT_NSAMPLES % 2 == 0) /* N is even */
power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
 
m = cab_reserve(cab_pwrdata);
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
 
#if defined(NO_GRX)
max = 0.0;
for (k=0; k<PWR_NSAMPLES; k++)
if (power_spectrum.p[k] > max)
max = power_spectrum.p[k];
 
//cprintf("%f %f\n",max,(max / EQU_SCALE) );
#endif
 
task_endcycle();
 
}
}
 
/* structure is like the wave task... */
TASK equ_task()
{
power *p;
 
int x[PWR_NSAMPLES];
int y;
int s;
 
int r,g,b;
 
while(1)
{
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the lines */
mutex_lock(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
x[s] = (int)(p->p[s] / EQU_SCALE);
 
if (x[s] > EQU_HEIGHT)
x[s] = EQU_HEIGHT;
 
x[s] = EQU_X - x[s];
 
 
#if defined(EQU_SHADE)
 
/* like the task equ2d... */
r = (int)(p->p[s] / EQU2D_SCALE);
if (r > EQU2D_CLIP)
r = EQU2D_CLIP;
 
if (r< 64) g = r * 4;
else if (r<128) g = (128-r) * 4;
else g = 0;
 
if (r<128) b = 0;
else if (r<192) b = (r-128) * 4;
else b = (256-r) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
#else
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,white);
#endif
}
mutex_unlock(&mutex);
 
task_endcycle();
 
/* erase the lines... */
mutex_lock(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,black);
}
mutex_unlock(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
}
}
 
TASK equ2d_task()
{
power *p;
 
int pwrint;
 
int x = 0;
 
int y,s;
 
int r,g,b;
 
while(1)
{
 
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the line */
mutex_lock(&mutex);
 
for(y = EQU2D_Y, s = 0;
s < EQU2D_NSAMPLES;
y++, s++ )
{
pwrint = (int)(p->p[s] / EQU2D_SCALE);
 
if (pwrint > EQU2D_CLIP)
pwrint = EQU2D_CLIP;
 
r = pwrint;
 
if (pwrint< 64) g = pwrint * 4;
else if (pwrint<128) g = (128-pwrint) * 4;
else g = 0;
 
if (pwrint<128) b = 0;
else if (pwrint<192) b = (pwrint-128) * 4;
else b = (256-pwrint) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
}
 
x = (x+1) % EQU2D_WIDTH;
grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES-1,white);
 
mutex_unlock(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
task_endcycle();
}
}
 
 
void init_fftplay(int freq)
{
SOFT_TASK_MODEL m3, m4, m5, m6;
 
PID p3,p4,p5,p6;
 
cab_windata = cab_create("windata", sizeof(window), 5);
cab_pwrdata = cab_create("pwr", sizeof(power), 5);
 
/* Init the sound lib */
sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
sound_info();
 
/* Init the data used by the raw_infun */
init_rawdata();
 
/* Start the self-buffering sampling operation */
sound_setfun(raw_infun, (int (*)(void *))-1);
sound_sample(NULL, freq, 0, DMA_OP | PCM16 | MYFUN, NULL);
 
soft_task_default_model(m3);
soft_task_def_level(m3,1);
soft_task_def_period(m3, PERIOD_WAVE);
soft_task_def_met(m3, WCET_WAVE);
soft_task_def_ctrl_jet(m3);
soft_task_def_group(m3, 1);
p3 = task_create("wave", wave_task, &m3, NULL);
if (p3 == -1) {
grx_close();
perror("FFTPlay: Could not create task <wave>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m4);
soft_task_def_level(m4,1);
soft_task_def_period(m4, PERIOD_FFT);
soft_task_def_met(m4, WCET_FFT);
soft_task_def_group(m4, 1);
soft_task_def_stack(m4,32*1024);
soft_task_def_usemath(m4);
soft_task_def_ctrl_jet(m4);
p4 = task_create("fft", fft_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("FFTPlay: Could not create task <fft>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m5);
soft_task_def_level(m5,1);
soft_task_def_period(m5, PERIOD_EQU);
soft_task_def_met(m5, WCET_EQU);
soft_task_def_group(m5, 1);
soft_task_def_stack(m5,32*1024);
soft_task_def_usemath(m5);
soft_task_def_ctrl_jet(m5);
p5 = task_create("equ", equ_task, &m5, NULL);
if (p5 == -1) {
grx_close();
perror("FFTPlay: Could not create task <equ>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <equ>\n");
sys_end();
}
 
soft_task_default_model(m6);
soft_task_def_level(m6,1);
soft_task_def_period(m6, PERIOD_EQU2D);
soft_task_def_met(m6, WCET_EQU2D);
soft_task_def_group(m6, 1);
soft_task_def_stack(m6,32*1024);
soft_task_def_usemath(m6);
soft_task_def_ctrl_jet(m6);
p6 = task_create("equ2D", equ2d_task, &m6, NULL);
if (p6 == -1) {
grx_close();
perror("FFTPlay: Could not create task <equ2d>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <equ2D>\n");
sys_end();
}
}
 
void scenario_fftplay(int f)
{
int i,y;
char s[50];
 
grx_line(0,WAVE_Y-WAVE_HEIGHT-1,383,WAVE_Y-WAVE_HEIGHT-1,red);
grx_line(0,WAVE_Y+WAVE_HEIGHT+1,383,WAVE_Y+WAVE_HEIGHT+1,red);
grx_line(0,EQU_Y-11 ,383,EQU_Y-11 ,red);
 
 
 
/* lines near the frequencies */
grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES-1,red);
grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES-1,red);
 
for (i=0; i<SCENARIO_NLABEL; i++)
{
y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
if (i == SCENARIO_NLABEL-1) y--;
grx_line(EQU_X +1,EQU_Y+y,EQU_X +4,EQU_Y+y,red);
grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-4,EQU_Y+y,red);
 
itoa((i*f)/(SCENARIO_NLABEL-1),s);
grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
}
 
grx_text("Power Spectrum" , 0, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Power Spectrum Story", EQU2D_X+EQU2D_WIDTH-160, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
}
 
void compute_params(int *freq,WORD *nsamp)
{
if (*freq< 2000)
{
cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
*freq = 2000;
}
if (*freq<= 8000) { *nsamp = 64; return; } //128
if (*freq<=16000) { *nsamp = 64; return; } //256
if (*freq<=24000) { *nsamp = 64; return; } //512
if (*freq>48000)
{
cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
*freq = 48000;
}
if (*freq<=48000) { *nsamp = 64; return; } //1024
}
 
/demos/branches/pj/thdemo/initfile.c
0,0 → 1,146
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:41 $
------------
 
System initialization file
 
h3pi.c
 
This file is equal to hartik3.c plus the resources module...
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
//#define PI
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
 
#ifndef PI
#include "modules/rrsoft.h"
#endif
 
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
//#define RRTICK 3000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
#ifdef PI
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
#else
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
#endif
 
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
NOP_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
kern_printf("TIME=%ld\n",sys_gettime(NULL));
KEYB_init(NULL);
kern_printf("TIME=%ld\n",sys_gettime(NULL));
// KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
 
#ifdef PI
void app_mutex_init(mutex_t *m)
{
PI_mutexattr_t attr;
 
PI_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#else
void app_mutex_init(mutex_t *m)
{
NOP_mutexattr_t attr;
 
NOP_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#endif
/demos/branches/pj/thdemo/demo.c
0,0 → 1,294
/* Project: HARTIK 3.0 */
/* Description: Hard Real TIme Kernel for 386 & higher machines */
/* Author: Paolo Gai <pgai@rsk.it> */
/* Advanced Linux Sound Architecture (ALSA) */
/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
/* Luca Abeni */
/* FFTW by M. Frigo and S. G. Johnson */
 
/* Date: 08/09/1999 */
 
/* File: fftplay.c */
/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
 
 
 
#include "demo.h"
 
//#include <kernel/types.h>
//#include <kernel/model.h>
#include <kernel/func.h>
 
//#include <modules/cabs.h>
 
#include <string.h>
#include <stdlib.h>
 
#include <drivers/keyb.h>
//#include <drivers/crtwin.h>
#include <drivers/glib.h>
//#include <drivers/sound.h>
//#include <ports/rfftw.h>
 
 
 
/* Informations about the sampling rate and buffers */
WORD rawdata_nsamples;
WORD rawdata_buffer_size;
WORD rawdata_freq;
 
/* graphic mutex... */
mutex_t mutex;
 
/* useful colors... */
int white;
int black;
int red;
int gray;
 
void app_mutex_init(mutex_t *m);
 
 
static void version( void )
{
cprintf( "Hartik FFT Play 1.0\n" );
cprintf( "-----------------------\n" );
cprintf( "by Paolo Gai 1999\n" );
cprintf( " <pj@hartik.sssup.it>\n" );
cprintf( "-----------------------\n" );
}
 
void reverse(char s[])
{
int c, i, j;
 
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
 
char * itoa(int n, char *s)
{
int i, sign;
 
if ((sign = n) < 0)
n = -n;
 
i = 0;
 
do
{
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
 
if (sign < 0)
s[i++] = '-';
 
s[i] = 0;
 
reverse(s);
 
return s;
}
 
void display_jet(PID i)
{
char st[200];
TIME sum, max;
int n;
 
if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
if (n==0) n=1;
sprintf(st, "PID=%2d st=%3d Mean=%5d Max=%5d na=%10s",
(int)i,
(int)proc_table[i].status, (int)sum/n, (int)max,
proc_table[i].name);
mutex_lock(&mutex);
grx_text(st, 0, 400+i*8, 255, 0);
mutex_unlock(&mutex);
}
}
 
 
 
void scenario(int f)
{
grx_text("HARTIK 4.0 - LEGO Version" , 0,0, rgb16(0,255,0), black );
grx_text("Thesis Demo", 0,8, rgb16(0,255,0), black );
 
#ifdef FFT_ON
scenario_fftplay(f);
#endif
 
#ifdef FRAMEGRABBER_ON
scenario_framegrabber();
#endif
 
#ifdef JET_ON
scenario_jetcontrol();
#endif
 
#ifdef BALL_ON
scenario_ball();
#endif
}
 
 
void demo_exc_handler(int signo, siginfo_t *info, void *extra)
{
struct timespec t;
 
grx_close();
 
/* Default action for an kern exception is */
kern_cli();
ll_gettime(TIME_EXACT, &t),
kern_printf("\nHartik Exception raised!!!"
"\nTime (s:ns) :%ld:%ld"
"\nException number:%d"
"\nPID :%d\n",
t.tv_sec, t.tv_nsec, info->si_value.sival_int,
info->si_task);
sys_end();
// ll_abort(5);
}
 
void my_close(void *arg)
{
grx_close();
// sys_status(3);
}
 
 
void endfun(KEY_EVT *k)
{
grx_close();
cprintf("Ctrl-Brk pressed! Ending...\n");
sys_end();
}
 
void zerofun(KEY_EVT *k)
{
int i;
for (i=0; i<MAX_PROC; i++) jet_delstat(i);
}
 
void printeventqueue(void *arg)
{
struct event *p;
extern struct event *firstevent;
 
kern_cli();
grx_close();
kern_cli();
for (p = firstevent; p != NULL; p = p->next) {
kern_printf("par:%d time:%ld.%ld p:%d handler:%d\n",
(int)p->par, p->time.tv_sec, p->time.tv_nsec/1000, (int)p, (int)p->handler);
}
kern_sti();
}
 
int main(int argc, char **argv)
{
int modenum;
 
int f;
 
KEY_EVT k;
 
struct sigaction action;
 
srand(4);
 
version();
 
#ifdef FRAMEGRABBER_ON
if (argc == 1)
{
cprintf("type x fftplay <freq>");
return 0;
}
 
f = atoi(argv[1]);
compute_params(&f,&rawdata_nsamples);
#endif
 
keyb_set_map(itaMap);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = ALTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,zerofun);
k.flag = 0;
k.scan = KEY_ENT;
k.ascii = 13;
keyb_hook(k,endfun);
 
/* Init the standard Hartik exception handler */
/* Set the signal action */
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = demo_exc_handler;
action.sa_handler = 0;
sigfillset(&action.sa_mask); /* we block all the other signals... */
 
if (sigaction(SIGHEXC, &action, NULL) == -1) {
perror("Error initializing signals...");
sys_end();
}
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
 
grx_init();
modenum = grx_getmode(640, 480, 16);
 
grx_setmode(modenum);
 
/* init the graphic mutex */
app_mutex_init(&mutex);
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
gray = rgb16(128,128,128);
 
scenario(f/2);
// grx_close();
// clear();
#ifdef FFT_ON
init_fftplay(f);
#endif
 
#ifdef FRAMEGRABBER_ON
init_framegrabber();
#endif
 
#ifdef JET_ON
init_jetcontrol();
#endif
 
#ifdef BALL_ON
init_ball();
#endif
 
group_activate(1);
 
#ifdef FRAMEGRABBER_ON
start_framegrabber();
#endif
 
return 0;
}
 
 
/demos/branches/pj/thdemo/fftplay.c
0,0 → 1,770
/* Project: HARTIK 3.0 */
/* Description: Hard Real TIme Kernel for 386 & higher machines */
/* Author: Paolo Gai <pgai@rsk.it> */
/* Advanced Linux Sound Architecture (ALSA) */
/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
/* Luca Abeni */
/* FFTW by M. Frigo and S. G. Johnson */
 
/* Date: 08/09/1999 */
 
/* File: fftplay.c */
/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
 
 
/*
 
FFTPlay 1.0
-----------
 
This application reads data from the audio microphone and then put it
to the screen in a graphical oscilloscope-like form (both standard Hartik
SB driver and Alsa driver can be used).
 
The application also calculate a FFT on the latest values, and displays
the power spectrum in tho ways, one like an equalizator, and the other in a
2D form.
 
A resolution of 1024x768, 64K colors is used.
 
The task set is composed by these tasks and functions:
 
Self buffering functions (SB only)
----------------------------------
this function takes the samples read by the mic and then makes a window
with the last WINDATA_NSAMPLES samples. The window is then put in
the CAB windata.
 
Task raw and task mixer (ALSA only)
-----------------------------------
These tasks are used with the Alsa driver; because it doesn't support the
self-buffering mode, we have to do a forever cycle in witch we have to read
all the data. Then the data are managed like the self-buffering functions of
the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
the window.
(This approach is not good for realtime...)
 
Task wave
---------
This task read the last window and then put it on the screen in a wave form
on the top of the screen.
The task's period is set to 40 ms (25 fps).
 
Task fft
--------
This task read the last window and then it computes the FFT.
With the FFT data it computes the power spectrum, whitch is sent to the
CAB pwrdata.
The task's period is set to 10 ms (good for the 2D story task).
This task is the only Hard Task.
 
Task equ
--------
This task read the last power spectrum and displays it in a graphical
form, like a hi-fi equalizator.
The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
The task's period is set to 40 ms (25 fps).
 
Task equ2D
----------
This task read the lasf power spectrum and displays it in a graphical
one-line form. Each pixel is a power coefficient, and its colour shade
from black (no power) to red (high power) passing through green and blue.
The task display the last EQU2D_WIDTH power lines.
The task's period is set to 10 ms (good for the 2D story task).
 
****************************************************************************
TASK LOAD
****************************************************************************
 
period wcet
task tick (ms) us %
--------------------------------------------------------
sound driver 24->3 12->1.5 200 0.016->0.133
wave 80 40 11500 0.2875
fft 20 10 3000 0.3000
equ 80 40 7000 0.1750
equ2D 20 10 500 0.0500
-------------
0.812 (last 4)
*/
 
#include <ll/ll.h>
 
#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
 
#include <modules/cabs.h>
 
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
 
#include <drivers/keyb.h>
#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <ports/rfftw.h>
 
/* now the load constants... */
 
#define WCET_WAVE 11500
#define WCET_FFT 3000
#define WCET_EQU 500
#define WCET_EQU2D 500
 
#define PERIOD_WAVE 40000
#define PERIOD_FFT 10000
#define PERIOD_EQU 40000
#define PERIOD_EQU2D 10000
 
/* define if shorts critical sections wanted */
#define SHORT_CRITICAL_SECTIONS(x) \
if (!((x)%64)) \
{ \
sem_post(&mutex); \
sem_wait(&mutex); \
}
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
 
 
/* Only 4 Debug... */
/*#define NO_GRX */
 
/* Samples are 16-bit signed integers */
typedef short SAMPLE;
#define MAX_SAMPLE 32768
 
/* Informations about the sampling rate and buffers */
WORD rawdata_nsamples;
WORD rawdata_buffer_size;
WORD rawdata_freq;
 
/* Numbers of samples of the sample window */
#define WINDATA_NSAMPLES 1024
 
/* task WAVE */
/* the point (wave_x,wave_y) is on the center left of the area... */
#define WAVE_NSAMPLES 1024
#define WAVE_X 0
#define WAVE_Y 130
#define WAVE_HEIGHT 80
 
/* task FFT */
#define FFT_NSAMPLES WINDATA_NSAMPLES
#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
 
/* task EQU */
/* the point (equ_x, equ_y) is the top right corner */
#define EQU_NSAMPLES PWR_NSAMPLES
#define EQU_X 170
#define EQU_Y 255
#define EQU_HEIGHT 170
#define EQU_SHADE
 
/* task EQU2D */
/* the point (equ2d_x, equ2d_y) is the top left corner */
#define EQU2D_NSAMPLES EQU_NSAMPLES
#define EQU2D_X 255
#define EQU2D_Y EQU_Y
#define EQU2D_WIDTH 768
#define EQU2D_CLIP 255
 
/* scenario */
#define SCENARIO_NLABEL 16
 
/* Scale factors */
#define FFT_SCALE (16384.0)
#define EQU_SCALE (32.0)
#define EQU2D_SCALE (8.0)
//#define EQU_SCALE (64.0)
//#define EQU2D_SCALE (16.0)
 
 
/* CAB ports... */
CAB cab_windata; /* a window on the last WINDATA_DIM samples */
CAB cab_pwrdata; /* the last power spectrum */
 
/* for the cab_windata */
typedef struct {
int start;
SAMPLE sample[WINDATA_NSAMPLES];
} window;
 
/* for the cab_pwrdata */
typedef struct {
fftw_real p[PWR_NSAMPLES];
} power;
 
/* graphic mutex... */
sem_t mutex;
 
// win is global... because is used by raw_infun...
window win;
 
 
 
/* useful colors... */
int white;
int black;
int red;
 
static void version( void )
{
cprintf( "Hartik FFT Play 1.0\n" );
cprintf( "-----------------------\n" );
cprintf( "by Paolo Gai 1999\n" );
cprintf( " <pj@hartik.sssup.it>\n" );
cprintf( "-----------------------\n" );
}
 
void reverse(char s[])
{
int c, i, j;
 
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
 
char * itoa(int n, char *s)
{
int i, sign;
 
if ((sign = n) < 0)
n = -n;
 
i = 0;
 
do
{
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
 
if (sign < 0)
s[i++] = '-';
 
s[i] = 0;
 
reverse(s);
 
return s;
}
 
 
 
/*
This is the self-buffering function: read the samples and put their mean
value in a CAB
*/
int raw_infun(void *b)
{
int i;
char *w;
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<rawdata_nsamples/2; i++) {
win.sample[win.start] = audiobuf[i];
win.start = (win.start+1) % WINDATA_NSAMPLES;
}
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
 
#if defined(NO_GRX)
cprintf("X"); //"XXX%d\n",win.sample[win.start]);
#endif
return 0;
}
 
 
 
void init_rawdata()
{
int i;
char *w;
 
win.start = 0;
for (i=0; i<WINDATA_NSAMPLES; i++)
win.sample[i] = 0;
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
}
 
 
 
 
 
TASK wave_task()
{
window *p;
int x,y;
int s;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
 
/* let's print the wave */
sem_wait(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,white);
}
sem_post(&mutex);
 
task_endcycle();
 
/* let's erase the wave */
sem_wait(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,black);
}
sem_post(&mutex);
 
cab_unget(cab_windata,(char *)p);
 
}
}
 
 
rfftw_plan plan;
 
void fft_close(void *arg)
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task()
{
fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
power power_spectrum;
 
#if defined(NO_GRX)
fftw_real max = 0.0;
#endif
 
char *m;
 
int k, i;
 
window *p;
 
plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
 
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
while(1)
{
/* Let's prepare the intput FFT data */
p = (window *)cab_getmes(cab_windata);
 
for (k = 0, i = p->start;
k < FFT_NSAMPLES;
k++, i = (i+1)%WINDATA_NSAMPLES)
in[k] = p->sample[i]/FFT_SCALE;
 
cab_unget(cab_windata,(char *)p);
 
/* zero-padding if needed */
for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
in[k] = 0.0;
 
rfftw_one(plan, in, out);
 
/* power spectrum computation */
power_spectrum.p[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
if (FFT_NSAMPLES % 2 == 0) /* N is even */
power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
 
m = cab_reserve(cab_pwrdata);
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
 
#if defined(NO_GRX)
max = 0.0;
for (k=0; k<PWR_NSAMPLES; k++)
if (power_spectrum.p[k] > max)
max = power_spectrum.p[k];
 
//cprintf("%f %f\n",max,(max / EQU_SCALE) );
#endif
 
task_endcycle();
 
}
}
 
/* structure is like the wave task... */
TASK equ_task()
{
power *p;
 
int x[PWR_NSAMPLES];
int y;
int s;
 
int r,g,b;
 
while(1)
{
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the lines */
sem_wait(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
x[s] = (int)(p->p[s] / EQU_SCALE);
 
if (x[s] > EQU_HEIGHT)
x[s] = EQU_HEIGHT;
 
x[s] = EQU_X - x[s];
 
 
#if defined(EQU_SHADE)
 
/* like the task equ2d... */
r = (int)(p->p[s] / EQU2D_SCALE);
if (r > EQU2D_CLIP)
r = EQU2D_CLIP;
 
if (r< 64) g = r * 4;
else if (r<128) g = (128-r) * 4;
else g = 0;
 
if (r<128) b = 0;
else if (r<192) b = (r-128) * 4;
else b = (256-r) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
#else
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,white);
#endif
}
sem_post(&mutex);
 
task_endcycle();
 
/* erase the lines... */
sem_wait(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,black);
}
sem_post(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
}
}
 
TASK equ2d_task()
{
power *p;
 
int pwrint;
 
int x = 0;
 
int y,s;
 
int r,g,b;
 
while(1)
{
 
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the line */
sem_wait(&mutex);
 
for(y = EQU2D_Y, s = 0;
s < EQU2D_NSAMPLES;
y++, s++ )
{
pwrint = (int)(p->p[s] / EQU2D_SCALE);
 
if (pwrint > EQU2D_CLIP)
pwrint = EQU2D_CLIP;
 
r = pwrint;
 
if (pwrint< 64) g = pwrint * 4;
else if (pwrint<128) g = (128-pwrint) * 4;
else g = 0;
 
if (pwrint<128) b = 0;
else if (pwrint<192) b = (pwrint-128) * 4;
else b = (256-pwrint) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
}
 
x = (x+1) % EQU2D_WIDTH;
grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES,white);
 
sem_post(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
task_endcycle();
}
}
 
TASK prova_task()
{
window *p;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
cprintf("%d %d %d\t", p->start /*sample[0]*/,p->sample[1],p->sample[2]);
cab_unget(cab_windata,(char *)p);
 
task_endcycle();
}
}
 
 
void scenario(int f)
{
int i,y;
char s[6];
 
grx_line(0,WAVE_Y-WAVE_HEIGHT-1,1023,WAVE_Y-WAVE_HEIGHT-1,red);
grx_line(0,WAVE_Y+WAVE_HEIGHT+1,1023,WAVE_Y+WAVE_HEIGHT+1,red);
grx_line(0,EQU_Y-11 ,1023,EQU_Y-11 ,red);
 
 
 
/* lines near the frequencies */
grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES,red);
grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES,red);
 
for (i=0; i<SCENARIO_NLABEL; i++)
{
y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
if (i == SCENARIO_NLABEL-1) y--;
grx_line(EQU_X +1,EQU_Y+y,EQU_X +10,EQU_Y+y,red);
grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-10,EQU_Y+y,red);
 
itoa((i*f)/(SCENARIO_NLABEL-1),s);
grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
}
 
grx_text("FFTPlay 1.0 - by Paolo Gai 1999 <pj@hartik.sssup.it>", 0,8, rgb16(0,255,0), black );
grx_text("...press ENTER key to exit..." , 0,24, rgb16(0,255,0), black );
 
grx_text("FFT Power Spectrum", 0 , EQU_Y-21, rgb16(0,0,255), black);
grx_text("FFT Power Story", EQU2D_X+16, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
 
}
 
 
 
 
void compute_params(int *freq,WORD *nsamp, WORD *per)
{
if (*freq< 2000)
{
cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
*freq = 2000;
}
if (*freq<= 8000) { *nsamp = 128; *per = 10; return; }
if (*freq<=16000) { *nsamp = 256; *per = 10; return; }
if (*freq<=24000) { *nsamp = 512; *per = 10; return; }
if (*freq>48000)
{
cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
*freq = 48000;
}
if (*freq<=48000) { *nsamp = 1024;*per = 10; return; }
}
 
 
 
void my_close(void *arg)
{
grx_close();
sys_status(3);
}
 
 
void endfun(KEY_EVT *k)
{
cprintf("Ctrl-Brk pressed! Ending...\n");
sys_end();
}
 
int main(int argc, char **argv)
{
int modenum;
 
int f;
 
/* irq period... */
WORD period;
 
KEY_EVT k;
 
SOFT_TASK_MODEL m3, m4, m5, m6;
 
PID p3,p4,p5,p6;
 
version();
 
if (argc == 1)
{
cprintf("type x fftplay <freq>");
return 0;
}
 
f = atoi(argv[1]);
compute_params(&f,&rawdata_nsamples,&period);
 
keyb_set_map(itaMap);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
 
cab_windata = cab_create("windata", sizeof(window), 4);
cab_pwrdata = cab_create("pwr", sizeof(power), 4);
 
/* Init the sound lib */
sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
sound_info();
 
/* Init the data used by the raw_infun */
init_rawdata();
 
/* Start the self-buffering sampling operation */
sound_setfun(raw_infun, (int (*)(void *))-1);
sound_sample(NULL, f, 0, DMA_OP | PCM16 | MYFUN, NULL);
 
cprintf("Press Enter...");
while (keyb_getchar() != 13);
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
#if !defined(NO_GRX)
grx_init();
modenum = grx_getmode(1024, 768, 16);
grx_setmode(modenum);
 
/* init the graphic mutex */
sem_init(&mutex, 0, 1);
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
 
scenario(f/2);
 
#endif
 
#if !defined(NO_GRX)
soft_task_default_model(m3);
soft_task_def_period(m3, PERIOD_WAVE);
soft_task_def_met(m3, WCET_WAVE);
soft_task_def_group(m3, 1);
p3 = task_create("wave", wave_task, &m3, NULL);
if (p3 == -1) {
perror("FFTPlay: Could not create task <wave>\n");
sys_end();
}
#endif
 
soft_task_default_model(m4);
soft_task_def_period(m4, PERIOD_FFT);
soft_task_def_met(m4, WCET_FFT);
soft_task_def_group(m4, 1);
soft_task_def_stack(m4,32*1024);
soft_task_def_usemath(m4);
p4 = task_create("fft", fft_task, &m4, NULL);
if (p4 == -1) {
perror("FFTPlay: Could not create task <fft>\n");
sys_end();
}
 
#if !defined(NO_GRX)
soft_task_default_model(m5);
soft_task_def_period(m5, PERIOD_EQU);
soft_task_def_met(m5, WCET_EQU);
soft_task_def_group(m5, 1);
soft_task_def_stack(m5,32*1024);
soft_task_def_usemath(m5);
p5 = task_create("equ", equ_task, &m5, NULL);
if (p5 == -1) {
perror("FFTPlay: Could not create task <equ>\n");
sys_end();
}
#endif
 
#if !defined(NO_GRX)
soft_task_default_model(m6);
soft_task_def_period(m6, PERIOD_EQU2D);
soft_task_def_met(m6, WCET_EQU2D);
soft_task_def_group(m6, 1);
soft_task_def_stack(m6,32*1024);
soft_task_def_usemath(m6);
p6 = task_create("equ2D", equ2d_task, &m5, NULL);
if (p6 == -1) {
perror("FFTPlay: Could not create task <equ2D>\n");
sys_end();
}
#else
/* Start the prova task */
//task_def_wcet(m6,1000);
//task_activate(task_create("prova",prova_task,TASK_TYPE,PERIODIC,200,&m6));
#endif
 
group_activate(1);
 
/* Wait until the user get bored */
while (keyb_getchar() != 13);
 
sys_end();
 
return 0;
}
 
 
/demos/branches/pj/thdemo/jetctrl.c
0,0 → 1,200
// JetControl
 
#include "demo.h"
#include "kernel/func.h"
 
TASK jetdummy_task(void *arg)
{
TIME now_dummy, last_dummy, diff_dummy, slice;
struct timespec now, last, diff;
int x = 0;
int height;
 
NULL_TIMESPEC(&last);
last_dummy = 0;
for (;;) {
task_nopreempt();
jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
sys_gettime(&now);
task_preempt();
 
SUBTIMESPEC(&now, &last, &diff);
slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
diff_dummy = now_dummy - last_dummy;
 
height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
 
TIMESPEC_ASSIGN(&last, &now);
last_dummy = now_dummy;
 
mutex_lock(&mutex);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
mutex_unlock(&mutex);
 
x = (x+1)%JET_DUMMY_WIDTH;
 
task_endcycle();
}
}
 
 
TASK jetctrl_task(void *arg)
{
char st[50];
TIME sum, max;
int n;
 
PID i;
int printed = 0;
 
for (;;) {
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
if (!n) n=1;
sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
mutex_lock(&mutex);
grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
}
while (printed<JET_NTASK) {
mutex_lock(&mutex);
grx_text(" ",
384, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
task_endcycle();
}
}
 
TASK jetslide_task(void *arg)
{
TIME sum, curr, max;
 
TIME total[JET_NTASK];
int slides[JET_NTASK];
 
PID i;
int printed = 0;
 
for (;;) {
// Fill the total array in a nonpreemptive section
task_nopreempt();
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
total[printed] = sum+curr;
printed++;
}
}
task_preempt();
 
while (printed < JET_NTASK)
total[printed++] = 0;
 
// Compute the Max elapsed time
max = 0;
for (i=0; i<JET_NTASK; i++)
if (total[i] > max) max = total[i];
if (!max) max = 1;
 
// Compute the slides width
for (i=0; i<JET_NTASK; i++)
slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
 
// print the data
mutex_lock(&mutex);
for (i=0; i<JET_NTASK; i++) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
}
 
while (i<JET_NTASK) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
i++;
}
mutex_unlock(&mutex);
task_endcycle();
}
}
 
 
void scenario_jetcontrol(void)
{
grx_text("System load" , 384, 248, rgb16(0,0,255), black);
grx_line(384,258,639,258,red);
 
grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
 
grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
 
grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
 
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
grx_line(384,258,639,258,red);
}
 
void init_jetcontrol(void)
{
SOFT_TASK_MODEL m3, m4, m5;
 
PID p3, p4, p5;
 
soft_task_default_model(m3);
soft_task_def_level(m3,1);
soft_task_def_period(m3, PERIOD_JETCTRL);
soft_task_def_met(m3, WCET_JETCTRL);
soft_task_def_ctrl_jet(m3);
soft_task_def_group(m3, 1);
p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
if (p3 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetctrl>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m4);
soft_task_def_level(m4,1);
soft_task_def_period(m4, PERIOD_JETDUMMY);
soft_task_def_met(m4, WCET_JETDUMMY);
soft_task_def_group(m4, 1);
soft_task_def_usemath(m4);
soft_task_def_ctrl_jet(m4);
p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetdummy>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m5);
soft_task_def_level(m5,1);
soft_task_def_period(m5, PERIOD_JETSLIDE);
soft_task_def_met(m5, WCET_JETSLIDE);
soft_task_def_group(m5, 1);
soft_task_def_usemath(m5);
soft_task_def_ctrl_jet(m5);
p5 = task_create("jsli", jetslide_task, &m5, NULL);
if (p5 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetslide>\n");
ll_abort(54);
sys_end();
}
}
 
/demos/branches/pj/thdemo/camera.c
0,0 → 1,516
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID camera_PID;
PID tracking_PID;
 
static CAB frameCAB; // CAB di deposito delle immagini
static CAB trackingCAB; // CAB di deposito delle info di tracking
 
 
int img_border = 10;
int window_width = 40;
int window_height = 40;
TPixel pix_threshold = 128;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
TDataObj sequence[N_FRAMES];
 
 
 
void border_up_function(KEY_EVT key)
{
img_border++;
}
 
void border_down_function(KEY_EVT key)
{
img_border--;
}
 
void threshold_up_function(KEY_EVT key)
{
char st[50];
pix_threshold++;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
grx_text(st, 400, 100, 255, 0);
mutex_unlock(&mutex);
}
 
void threshold_down_function(KEY_EVT key)
{
char st[50];
pix_threshold--;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
grx_text(st, 400, 100, 255, 0);
mutex_unlock(&mutex);
}
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2)
{
return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
}
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
int x1, y1, x2, y2; // Must be int!!!
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
x1 = MAX_NUM((xc - window_width / 2), (border));
y1 = MAX_NUM((yc - window_height / 2), (border));
x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
 
for (i = y1; i < y2; i++) {
for (j = x1; j < x2; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
// *(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
// *(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
char scan_all_frame(TDataObj *data, TPixel *in_frame)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
// In a single image scanning it performs thresholding and computation
for (i = img_border; i < N_ROW - img_border; i++) {
for (j = img_border; j < N_COL - img_border; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
// *(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
// *(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to)
{
float vx, vy;
 
vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vx *= 1000;
 
vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vy *= 1000;
 
*track_x = sequence[top_frame - 1].xb + vx * time_to;
*track_y = sequence[top_frame - 1].yb + vy * time_to;
 
*int_vx = vx * 1000;
*int_vy = vy * 1000;
}
 
TASK tracking_task(void *arg)
{
// static unsigned int n_frame = 0;
char found;
TPixel *grabber_frame;
int top_frame = 0;
TDataObj current;
TTracking *track;
 
frameCAB = PXC_GetCab();
 
grabber_frame = cab_getmes(frameCAB);
 
// Executes first time
found = scan_all_frame(&current, grabber_frame);
if (found) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
}
 
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
 
while (1) {
// Acquisizione immagine corrente
grabber_frame = (TPixel *)cab_getmes(frameCAB);
track = (TTracking *)cab_reserve(trackingCAB);
 
// Estrazione della nuova trasformata sul frame corrente
if (found) {
found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
} else {
found = scan_all_frame(&current, grabber_frame);
}
 
track->found = found;
 
if (found) {
if (top_frame < N_FRAMES) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
} else {
top_frame = 0;
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
}
 
track->top_frame = top_frame;
memcpy(&track->current, &current, sizeof(TDataObj));
 
if (top_frame > 1) {
tracking(top_frame, &track->predx, &track->predy,
&track->vx, &track->vy, 100);
}
} else {
track->top_frame = top_frame = 0;
}
 
// Release CABs
cab_putmes(trackingCAB, (char *)track);
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
}
}
 
 
 
 
 
 
 
/*
*
*
*
* Camera task
*
*
*
*
*/
 
 
TASK camera_task(void *arg)
{
register int i,j,col,row;
static unsigned int n_frame = 0;
TPixel *grabber_frame;
TTracking *track;
char st[50];
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
while (1) {
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
grx_text(st, 400, 224, white, 0);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
for (i=1; i<IMG_ROW-1; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(grabber_frame+row*N_COL+col)];
}
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
for (j=0; j<IMG_COL; j++) {
converted_image[j] = gray_palette[0];
converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
}
 
mutex_lock(&mutex);
grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
(BYTE *)converted_image);
mutex_unlock(&mutex);
 
track = (TTracking *)cab_getmes(trackingCAB);
 
if (track->found) {
mutex_lock(&mutex);
// sprintf(st, "found: %d", track->found);
// grx_text(st, 400, 280, 255, 0);
 
if (track->top_frame > 1) {
int px, py;
 
// sprintf(st, "top_frame %5d", track->top_frame);
// grx_text(st, 400, 270, 255, 0);
 
if (track->predx < img_border)
px = img_border;
else if (track->predx > N_COL-img_border)
px = N_COL-img_border;
else
px = track->predx;
 
if (track->predy < img_border)
py = img_border;
else if (track->predy > N_ROW-img_border)
py = N_ROW-img_border;
else
py = track->predy;
 
grx_disc(IMG_X+(px*2)/3, IMG_Y+(py*2)/3, 3, 127);
 
// grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
grx_rect(IMG_X+(track->current.x1*2)/3, IMG_Y+(track->current.y1*2)/3,
IMG_X+(track->current.x2*2)/3, IMG_Y+(track->current.y2*2)/3, 127);
 
sprintf(st, "speed = (%5d, %5d) pix/s", track->vx, track->vy);
grx_text(st, 400, 232, white, 0);
}
mutex_unlock(&mutex);
}
cab_unget(trackingCAB, (char *)track);
 
task_endcycle();
}
}
 
 
 
 
 
/*
*
*
*
* Framegrabber Initialization
*
*
*
*
*/
 
void start_listener(TIME p);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void scenario_framegrabber()
{
grx_text("Camera" , 384, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
grx_line(384,WAVE_Y-WAVE_HEIGHT-1,639,WAVE_Y-WAVE_HEIGHT-1,red);
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
TIME period;
 
my_key.ascii = 'a';
my_key.scan = KEY_A;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
 
my_key.ascii = 'z';
my_key.scan = KEY_Z;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
 
my_key.ascii = 's';
my_key.scan = KEY_S;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
 
my_key.ascii = 'x';
my_key.scan = KEY_X;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
//for (i = 0; i < 256; i++)
// grx_setcolor(i, i/4, i/4, i/4);
 
mutex_lock(&mutex);
// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
 
// Some messages on screen
// grx_text("A-Z change threshold", 400, 240, 255, 0);
// grx_text("S-X change window borders", 400, 250, 255, 0);
mutex_unlock(&mutex);
 
period = PXC_Initiate(4);
 
if (!period) {
grx_close();
cprintf("Problemi nell'inizializzazione del framegrabber\n");
halt();
sys_end();
} else {
TTracking *trdata;
// tracking CAB init
trackingCAB = cab_create("trackingCAB", sizeof(TTracking), 3);
trdata = (TTracking *)cab_reserve(trackingCAB);
trdata->found = 0;
cab_putmes(trackingCAB, (char *)trdata);
 
start_listener(period);
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(TIME period)
{
SOFT_TASK_MODEL m1, m2;
 
soft_task_default_model(m1);
soft_task_def_level(m1,1);
soft_task_def_met(m1,WCET_TRACKING);
soft_task_def_usemath(m1);
// soft_task_def_aperiodic(m1);
soft_task_def_period(m1,(PERIOD_TRACKING));
soft_task_def_group(m1,1);
soft_task_def_ctrl_jet(m1);
soft_task_def_skip_arrivals(m1);
tracking_PID = task_create("track", tracking_task, &m1, NULL);
if (tracking_PID == -1) {
grx_close();
perror("FFTPlay: Could not create task <tra>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <tracking>\n");
sys_end();
}
 
soft_task_default_model(m2);
soft_task_def_level(m2,1);
soft_task_def_met(m2,WCET_CAMERA);
soft_task_def_usemath(m2);
// soft_task_def_aperiodic(m2);
soft_task_def_period(m2,PERIOD_CAMERA);
soft_task_def_group(m2,1);
soft_task_def_ctrl_jet(m2);
// soft_task_def_skip_arrivals(m2);
camera_PID = task_create("cam", camera_task, &m2, NULL);
if (camera_PID == -1) {
grx_close();
perror("FFTPlay: Could not create task <came>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <camera>\n");
sys_end();
}
 
}
 
void start_framegrabber()
{
// PXC_Push_Listener(tracking_PID,2);
PXC_Start();
}
/demos/branches/pj/thdemo/demo.h
0,0 → 1,280
 
 
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/descr.h>
#include <math.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
 
 
#define FFT_ON
#define FRAMEGRABBER_ON
#define JET_ON
#define BALL_ON
 
/*
*
* WCET, Periods and Models
*
*/
 
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
// on Celeron 366
#define WCET_WAVE 450
#define WCET_FFT 722
#define WCET_EQU 1000
#define WCET_EQU2D 318
 
#define PERIOD_WAVE 40000
#define PERIOD_FFT 3000
#define PERIOD_EQU 40000
#define PERIOD_EQU2D 3000
 
 
 
 
#define WCET_TRACKING 4000
#define WCET_CAMERA 7000
 
#define PERIOD_TRACKING 40000
#define PERIOD_CAMERA 40000
 
 
#define WCET_JETCTRL 2600
#define WCET_JETDUMMY 1000
#define WCET_JETSLIDE 1000
 
#define PERIOD_JETCTRL 100000
#define PERIOD_JETDUMMY 100000
#define PERIOD_JETSLIDE 100000
 
 
#define WCET_BALL 60
 
#define PERIOD_BALL 10000
 
 
/*
*
* Soundcard related defines
*
*/
 
 
/* Samples are 16-bit signed integers */
typedef short SAMPLE;
#define MAX_SAMPLE 32768
 
 
 
/*
*
* FFT defines
*
*/
 
/* Numbers of samples of the sample window */
#define WINDATA_NSAMPLES 512
 
/* task WAVE */
/* the point (wave_x,wave_y) is on the center left of the area... */
#define WAVE_NSAMPLES 384
#define WAVE_X 0
#define WAVE_Y 64
#define WAVE_HEIGHT 32
 
/* task FFT */
#define FFT_NSAMPLES 512
#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
 
/* task EQU */
/* the point (equ_x, equ_y) is the top right corner */
#define EQU_NSAMPLES PWR_NSAMPLES
#define EQU_X 64
#define EQU_Y 128
#define EQU_HEIGHT 64
#define EQU_SHADE
 
/* task EQU2D */
/* the point (equ2d_x, equ2d_y) is the top left corner */
#define EQU2D_NSAMPLES EQU_NSAMPLES
#define EQU2D_X 128
#define EQU2D_Y EQU_Y
#define EQU2D_WIDTH 255
#define EQU2D_CLIP 255
 
/* scenario */
#define SCENARIO_NLABEL 16
 
/* Scale factors */
#define FFT_SCALE (16384.0)
#define EQU_SCALE (32.0)
#define EQU2D_SCALE (8.0)
//#define EQU_SCALE (64.0)
//#define EQU2D_SCALE (16.0)
 
 
 
/* Informations about the sampling rate and buffers */
extern WORD rawdata_nsamples;
extern WORD rawdata_buffer_size;
extern WORD rawdata_freq;
 
 
 
/*
*
* Global Stuffs
*
*/
 
/* graphic mutex... */
extern mutex_t mutex;
 
/* useful colors... */
extern int white;
extern int black;
extern int red;
extern int gray;
 
/* define if shorts critical sections wanted */
#define SHORT_CRITICAL_SECTIONS(x) \
if (!((x)%64)) \
{ \
mutex_lock(&mutex); \
mutex_unlock(&mutex); \
}
 
void init_fftplay(int freq);
void init_framegrabber();
void init_jetcontrol();
void init_ball(void);
void start_framegrabber();
 
 
void scenario_jetcontrol(void);
void scenario_fftplay(int f);
void scenario_framegrabber();
void scenario_ball();
 
void compute_params(int *freq,WORD *nsamp);
 
char * itoa(int n, char *s);
 
/*
*
* Framegrabber stuffs
*
*/
 
// if defined... object black on a white background
#ifndef __BLACK_ON_WHITE
#define __BLACK_ON_WHITE
#endif
 
#define ABS_NUM(a) ((a >= 0) ? a : -a)
#define MIN_NUM(a, b) ((a < b) ? a : b)
#define MAX_NUM(a, b) ((a > b) ? a : b)
 
 
// Cols and rows of the framegrabber image
#define N_COL 384
#define N_ROW 288
#define N_BPS 8 // Bits per pixel
#define N_GRIGI 256
 
#define N_FRAMES 100
 
/* pixel of the video image */
#define IMG_COL 256
#define IMG_ROW 192
 
/* position of the video image */
#define IMG_X 384
#define IMG_Y 32
 
// I singoli pixel sono caratteri a 8 bit
typedef unsigned char TPixel;
 
typedef struct {
int x1, y1;
int x2, y2;
int xb, yb;
TIME time_stamp;
} TDataObj;
 
typedef struct {
int found;
int top_frame;
int vx,vy;
int predx;
int predy;
TDataObj current;
} TTracking;
 
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2);
 
char scan_all_frame(TDataObj *data, TPixel *in_frame);
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border);
 
void threshold_up_function(KEY_EVT key);
void threshold_down_function(KEY_EVT key);
 
void border_up_function(KEY_EVT key);
void border_down_function(KEY_EVT key);
 
void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to);
 
TASK elab_image_TASK(void);
 
 
 
/*
*
* JETCONTROL stuffs
*
*/
 
#define JET_NTASK 18
#define JET_Y_NAME 320
 
#define DUMMY_PID 1
 
#define JET_DUMMY_WIDTH 210
#define JET_DUMMY_HEIGHT 40
 
/* the point (x, y) is the top left corner */
#define JET_DUMMY_X 428
#define JET_DUMMY_Y 264
 
#define JET_SLIDE_WIDTH 50
#define JET_SLIDE_X 576
 
 
 
 
/*
*
* BALL stuffs
*
*/
 
// x and y corners are specified whithout consider a border of 3 pixels
#define BALL_Y 475 /* position of the floor */
#define BALL_HEIGHT 70 /* initial height of the ball */
#define BALL_XMIN 3 /* min position X of the ball */
#define BALL_XMAX 380 /* max position X of the ball */
#define BALL_VELX 5. /* horizontal ball velocity */
#define BALL_VYMIN 11. /* velocit… minima per suono */
#define BALL_MAX_P 50 /* max number of balls */
 
#define BALL_GROUP 2 /* task group of the balls */
/demos/branches/pj/thdemo/ball.c
0,0 → 1,164
/*--------------------------------------------------------------*/
/* SIMULATION OF JUMPING BALLS */
/*--------------------------------------------------------------*/
 
/* CVS $Id: ball.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $ */
 
 
#include "demo.h"
#include <kernel/func.h>
#include <stdlib.h>
 
#define R 2 /* dimension of a ball */
#define G 9.8 /* acceleration of gravity */
 
static int ballexit = 0;
static int npc = 0; /* number of tasks created */
 
/*--------------------------------------------------------------*/
/* Periodic task for ball simulation */
/*--------------------------------------------------------------*/
 
TASK palla(int i)
{
int x, y; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int x0, y0; /* posizione iniziale X pallina */
float vx, vy; /* velocit… della pallina */
float vy0; /* velocita' pallina al primo rimbalzo */
float ty, tx; /* variabile temporale */
float dt; /* incremento temporale */
 
y = oy = y0 = BALL_HEIGHT;
x = ox = x0 = BALL_XMIN;
 
vy0= sqrt(2. * G * (float)BALL_HEIGHT);
vy = 0;
vx = BALL_VELX + rand()%9;
tx = 0;
ty = 0;
dt = ((float)PERIOD_BALL)/100000;
 
while (1) {
y = y0 + vy*ty - .5*G*ty*ty;
x = x0 + vx * tx;
 
if (y < 0) {
y = 0;
 
if (vy == 0.0)
vy = vy0;
else if (vy < BALL_VYMIN)
vy = vy0 * (1.0 - (rand()%50)/100.0);
else
vy = 0.9 * vy;
 
ty = 0.0;
y0 = 0;
}
 
if (x > BALL_XMAX) {
tx = 0.0;
x0 = BALL_XMAX;
vx = -vx;
x = x0 + vx * tx;
}
 
if (x < BALL_XMIN) {
tx = 0.0;
x0 = BALL_XMIN;
vx = -vx;
x = x0 + vx * tx;
}
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, 0);
ox = x;
oy = BALL_Y - y;
mutex_unlock(&mutex);
 
if (ballexit) {
npc--;
return 0;
}
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, i);
mutex_unlock(&mutex);
 
{
int xxx;
for (xxx=0; xxx<10000; xxx++);
}
ty += dt;
tx += dt;
task_endcycle();
}
}
 
void killball(KEY_EVT *k)
{
ballexit = 1;
}
 
void ballfun(KEY_EVT *k)
{
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
 
if (npc == BALL_MAX_P) return;
 
ballexit = 0;
 
r = 64 + rand()%192;
g = 64 + rand()%192;
b = 64 + rand()%192;
 
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, (void *)rgb16(r,g,b));
soft_task_def_group(mp, BALL_GROUP);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create("palla", palla, &mp, NULL);
if (pid != NIL) {
task_activate(pid);
npc++;
}
}
 
 
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
 
void scenario_ball()
{
grx_text("Noise", 0, BALL_Y-BALL_HEIGHT-15, rgb16(0,0,255), black);
grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
}
 
void init_ball(void)
{
KEY_EVT k;
 
mutex_lock(&mutex);
grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
mutex_unlock(&mutex);
 
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
keyb_hook(k,ballfun);
 
k.flag = 0;
k.scan = KEY_BKS;
k.ascii = ' ';
keyb_hook(k,killball);
}
 
/*--------------------------------------------------------------*/
/demos/branches/pj/thdemo/camera2.c
0,0 → 1,424
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID image_elab_PID;
TIME periodo;
CAB PXC_CAB;
 
static CAB frameCAB; // CAB di deposito delle immagini
static TDataObj current, older;
 
// extern in INIT.C
int img_border = 10;
int window_width = 40;
int window_height = 40;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
 
#ifdef __BLACK_ON_WHITE
TPixel pix_threshold = 64;
#else
TPixel pix_threshold = 243;
#endif
 
 
// Global for testing!!!
static char st[50];
TIME before;
 
TDataObj sequence[N_FRAMES];
int top_frame = 0;
 
double dist, speed;
 
static TPixel *grabber_frame;
 
void border_up_function(KEY_EVT key)
{
img_border++;
}
 
void border_down_function(KEY_EVT key)
{
img_border--;
}
 
void threshold_up_function(KEY_EVT key)
{
pix_threshold++;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
//grx_text(st, 400, 300, 255, 0);
mutex_unlock(&mutex);
}
 
void threshold_down_function(KEY_EVT key)
{
pix_threshold--;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
//grx_text(st, 400, 300, 255, 0);
mutex_unlock(&mutex);
}
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2)
{
return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
}
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
int x1, y1, x2, y2; // Must be int!!!
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
x1 = MAX_NUM((xc - window_width / 2), (border));
y1 = MAX_NUM((yc - window_height / 2), (border));
x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
 
for (i = y1; i < y2; i++) {
for (j = x1; j < x2; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
*(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
*(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
char scan_all_frame(TDataObj *data, TPixel *in_frame)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
// In a single image scanning it performs thresholding and computation
for (i = img_border; i < N_ROW - img_border; i++) {
for (j = img_border; j < N_COL - img_border; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
*(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
*(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
void tracking(int *track_x, int *track_y, int time_to)
{
float vx, vy;
 
vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vx *= 1000000;
 
vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vy *= 1000000;
 
(*track_x) = sequence[top_frame - 1].xb + vx * time_to;
(*track_y) = sequence[top_frame - 1].yb + vy * time_to;
 
sprintf(st, "speed = (%5d, %5d) pix/s", (int)vx, (int)vy);
mutex_lock(&mutex);
//grx_text(st, 400, 410, 255, 0);
mutex_unlock(&mutex);
}
 
void put_frame(TPixel *frame)
{
register int i,j,col,row;
 
for (i=0; i<IMG_ROW; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
}
 
mutex_lock(&mutex);
//grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
// (BYTE *)converted_image);
mutex_unlock(&mutex);
}
 
 
TASK elab_image_TASK(void)
{
// register int i, j;
static unsigned int n_frame = 0;
char found;
int pred_x, pred_y;
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
grabber_frame = cab_getmes(frameCAB);
 
// Executes first time
found = scan_all_frame(&current, grabber_frame);
// found =0;
if (found) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
}
 
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
 
while (1) {
 
// before = sys_gettime(NULL);
 
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
mutex_lock(&mutex);
//grx_text(st, 400, 290, 255, 0);
 
sprintf(st, "top_frame %5d", top_frame);
//grx_text(st, 400, 270, 255, 0);
 
sprintf(st, "found: %d!", found);
//grx_text(st, 400, 280, 255, 0);
mutex_unlock(&mutex);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
// copy current in older
memcpy(&older, &current, sizeof(TDataObj));
 
// Estrazione della nuova trasformata sul frame corrente
if (found) {
found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
} else {
found = scan_all_frame(&current, grabber_frame);
}
 
// //grx_putimage(0, 0, N_COL - 1, N_ROW - 1, grabber_frame);
put_frame(grabber_frame);
 
if (found) {
if (top_frame < N_FRAMES) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
} else {
top_frame = 0;
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
}
 
if (top_frame > 1) {
tracking(&pred_x, &pred_y, 100);
 
mutex_lock(&mutex);
// //grx_disc(IMG_X+(pred_x*2)/3, IMG_Y+(pred_y*2)/3, 3, 127);
 
//grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
//grx_rect(IMG_X+(current.x1*2)/3, IMG_Y+(current.y1*2)/3,
// IMG_X+(current.x2*2)/3, IMG_Y+(current.y2*2)/3, 127);
mutex_unlock(&mutex);
 
}
} else {
top_frame = 0;
}
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
// sprintf(st, "durata = %3d ms", (int)(sys_gettime(NULL) - before)/1000);
// mutex_lock(&mutex);
// //grx_text(st, 400, 400, 255, 0);
// mutex_unlock(&mutex);
 
task_endcycle();
}
}
 
 
void start_listener(void);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
 
my_key.ascii = 'a';
my_key.scan = KEY_A;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
 
my_key.ascii = 'z';
my_key.scan = KEY_Z;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
 
my_key.ascii = 's';
my_key.scan = KEY_S;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
 
my_key.ascii = 'x';
my_key.scan = KEY_X;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
//for (i = 0; i < 256; i++)
// grx_setcolor(i, i/4, i/4, i/4);
 
mutex_lock(&mutex);
// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
 
// Some messages on screen
//grx_text("A-Z change threshold", 400, 240, 255, 0);
//grx_text("S-X change window borders", 400, 250, 255, 0);
mutex_unlock(&mutex);
 
periodo = PXC_Initiate(3);
PXC_CAB = PXC_GetCab();
 
if (!periodo) {
//grx_close();
cprintf("Problemi nell'inizializzazione del driver\n");
sys_end();
} else {
start_listener();
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(void)
{
SOFT_TASK_MODEL m_soft;
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,IMAGING_WCET);
soft_task_def_usemath(m_soft);
soft_task_def_aperiodic(m_soft);
soft_task_def_period(m_soft,(periodo*3));
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
 
image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
 
/* task_activate( image_elab_PID);
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();*/
}
 
void start_framegrabber()
{
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();
}
/demos/branches/pj/thdemo/readme.txt
0,0 → 1,17
PJ's Thesis demo
----------------
 
This is my Thesis Demo. The demo works correctly on my PC :-)
(a celeron 366 Mhz), Probably It will have some problems with other slower PCs.
 
The demo simply reads data from the soundblaster, then print the sound wave, compute a power spectrun and display it on the screen.
 
Then there is another few tasks that reads data from a framegrabber and track a black image on a white board.
 
Moreover, there are some noise balls to test the system in overload conditions, and there are finally a few tasks that displays the system load.
 
If you have any problems using this demo, please contact pj@sssup.it
 
bye
 
Paolo
/demos/branches/pj/thdemo/makefile
0,0 → 1,23
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= demo
 
include $(BASE)/config/example.mk
 
demo:
make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="fft.o camera.o initfile.o jetctrl.o ball.o" OTHERINCL=
 
 
 
 
 
 
 
 
/demos/branches/pj/thdemo/ball2.c
0,0 → 1,156
/*--------------------------------------------------------------*/
/* SIMULATION OF JUMPING BALLS */
/*--------------------------------------------------------------*/
 
/* CVS $Id: ball2.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $ */
 
 
#include "demo.h"
#include <kernel/func.h>
#include <stdlib.h>
//#include <drivers/glib.h>
//#include <drivers/keyb.h>
//#include <math.h>
 
#define R 2 /* dimension of a ball */
#define G 9.8 /* acceleration of gravity */
#define BASE 30 /* position of the floor */
#define TOP 80 /* initial height of the ball */
#define XMIN 3 /* min position X of the ball */
#define XMAX 380 /* max position X of the ball */
#define VELX 5. /* horizontal ball velocity */
#define VMIN 11. /* velocit… minima per suono */
#define ESC 27 /* ASCII code of ESCAPE key */
#define MAX_P 50 /* max number of balls */
 
double v0[MAX_P]; /* impact velocity with floor */
 
/*--------------------------------------------------------------*/
/* Periodic task for ball simulation */
/*--------------------------------------------------------------*/
 
TASK palla(int i)
{
int x, y; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int x0; /* posizione iniziale X pallina */
float vx, vy; /* velocit… della pallina */
float t, tx; /* variabile temporale */
float dt; /* incremento temporale */
double arg; /* variabile di appoggio */
 
y = oy = TOP;
x = ox = x0 = XMIN;
 
arg = 2. * G * (float)TOP;
vy = sqrt(arg);
vx = VELX;// + rand()%10;
tx = 0.0;
t = vy / G;
dt = 0.1;
 
while (1) {
y = TOP + vy*t - .5*G*t*t;
x = x0 + vx * tx;
 
if (y < BASE) {
t = 0.0;
v0[i] = .9 * v0[i];
// if (v0[i]<VMIN) {
 
// v0[i] = sqrt(2. * G * (float)TOP);
// v0[i] = sqrt(arg);// * (1-((float)(rand()%20))/100);
//vx = vx + rand()%5 - 2;
//tx = 0.0;
//x0 = x;
// }
 
vy = v0[i];
y = TOP + vy*t - .5*G*t*t;
}
 
 
if (x > XMAX) {
tx = 0.0;
x0 = XMAX;
vx = -vx;
x = x0 + vx * tx;
}
 
if (x < XMIN) {
tx = 0.0;
x0 = XMIN;
vx = -vx;
x = x0 + vx * tx;
}
y = 480-y;
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, 0);
grx_disc(x, y, R, i);
mutex_unlock(&mutex);
 
oy = y; ox = x;
t += dt;
tx += dt;
task_endcycle();
}
}
 
 
void ballfun(KEY_EVT *k)
{
static int npc = 0; /* number of tasks created */
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
 
if (npc == MAX_P) return;
 
r = 64 + rand()%192;
g = 64 + rand()%192;
b = 64 + rand()%192;
 
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, rgb16(r,g,b));
soft_task_def_group(mp, 1);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create("palla", palla, &mp, NULL);
if (pid != NIL) {
task_activate(pid);
npc++;
}
}
 
 
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
 
 
void init_ball(void)
{
char c; /* character from keyboard */
int i; /* pressed number */
double arg; /* temporary variable */
KEY_EVT k;
 
arg = 2. * G * (float)TOP;
for (i=0; i<MAX_P; i++) v0[i] = sqrt(arg);
 
mutex_lock(&mutex);
grx_rect(XMIN-R-1, 480-TOP-BASE-R-1, XMAX+R+1, 480-BASE+R+1, 14);
mutex_unlock(&mutex);
 
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
keyb_hook(k,ballfun);
 
}
 
/*--------------------------------------------------------------*/
/demos/branches/pj/thdemo/camera4.c
0,0 → 1,168
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID image_elab_PID;
TIME periodo;
CAB PXC_CAB;
 
static CAB frameCAB; // CAB di deposito delle immagini
static TDataObj current, older;
 
// extern in INIT.C
int img_border = 10;
int window_width = 40;
int window_height = 40;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
 
#ifdef __BLACK_ON_WHITE
TPixel pix_threshold = 64;
#else
TPixel pix_threshold = 243;
#endif
 
 
// Global for testing!!!
static char st[50];
TIME before;
 
TDataObj sequence[N_FRAMES];
int top_frame = 0;
 
double dist, speed;
 
static TPixel *grabber_frame;
 
void put_frame(TPixel *frame)
{
register int i,j,col,row;
 
for (i=1; i<IMG_ROW-1; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
}
 
for (j=0; j<IMG_COL; j++) {
converted_image[j] = gray_palette[0];
converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
}
 
mutex_lock(&mutex);
grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
(BYTE *)converted_image);
mutex_unlock(&mutex);
}
 
 
TASK elab_image_TASK(void)
{
// register int i, j;
static unsigned int n_frame = 0;
char found;
int pred_x, pred_y;
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
while (1) {
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
mutex_lock(&mutex);
grx_text(st, 400, 290, 255, 0);
mutex_unlock(&mutex);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
put_frame(grabber_frame);
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
}
}
 
 
void start_listener(void);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
 
periodo = PXC_Initiate(3);
PXC_CAB = PXC_GetCab();
 
if (!periodo) {
grx_close();
cprintf("Problemi nell'inizializzazione del driver\n");
sys_end();
} else {
start_listener();
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(void)
{
SOFT_TASK_MODEL m_soft;
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,IMAGING_WCET);
soft_task_def_usemath(m_soft);
soft_task_def_aperiodic(m_soft);
soft_task_def_period(m_soft,(periodo));
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
 
image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
 
/* task_activate( image_elab_PID);
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();*/
}
 
void start_framegrabber()
{
PXC_Push_Listener(image_elab_PID,1);
PXC_Start();
}
/demos/branches/pj/simcity/keyboard.c
0,0 → 1,49
/* ------------------ */
/* Keyboard handler */
/* ------------------ */
 
#include <drivers/keyb.h>
#include "include/keyfunct.h"
 
void keyb_h() {
KEY_EVT k;
keyb_set_map(itaMap);
/* Exit keys: ALT-X, ENTER */
k.flag = ALTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
k.flag = ALTR_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
k.flag = 0;
k.scan = KEY_ENT;
k.ascii = 13;
keyb_hook(k, endfun);
/* Create HARD cars */
k.flag = 0;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, h_car_create);
/* kill hard cars*/
k.flag = 0;
k.scan = KEY_K;
k.ascii = 'k';
keyb_hook(k, h_car_kill);
//refresh map
k.flag=0;
k.scan = KEY_R;
k.ascii = 'r';
keyb_hook(k, refresh);
//create soft cars
k.flag=0;
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, s_car_create);
//toggle sensors
k.flag=0;
k.scan = KEY_D;
k.ascii = 'd';
keyb_hook(k, sensor_switch);
}
/demos/branches/pj/simcity/include/constant.h
0,0 → 1,99
/*************************const.h*******************************/
// constants and new types declaration
#include <kernel/func.h>
#define CST
 
#define NO_SPRITE 8
 
 
#define GRAPH
#define SENSOR
#define MAX_CAR 10
#define MAX_TL 3
#define S_POINT 4
#define PERIOD_CAR 135000 //period for K62 350MHZ
//#define PERIOD_CAR 87000 //period for PIII 733MHZ
#define SPERIOD_CAR 13000
#define SCAR_WCET 4300
#define SECOND 1000000
#define TL_WCET 200
#define CAM_WCET 200
#define GAUGE_WCET 200
#define ARROW_WCET 100
//#define CAR_WCET 7700 //wcet for PIII 733MHZ
#define CAR_WCET 12400 //wcet for K62 350MHZ
#define ROW 30
#define COL 30
#define NCAR 24
#define W 640
#define H 480
#define SH 12
#define SW 12
#define MAX_DIST 50.0
#define NORM_DIST 15.0
#define COLL_DIST 25.0
#define MIN_SPEED 0.0
#define NORM_SPEED 4.0
#define MAX_SPEED 6.0
#define MAX_LOOK 50
#define LOOK_ANGLE 70
#define DIST_ANGLE 90
#define CORR_FACT 0.7
#define FRANTIC 0.0
#define POS_RAND
#define OBL_START 1
#define DEG_TO_RAD(x) ((float)x)/180.0*3.14
#define RAD_TO_DEG(x) ((float)x)/3.14*180.0
#define RANDDIR (rand()%3-1)
#define L 0
#define R 1
#define U 2
#define D 3
 
#define DRAW 1
#define CANCEL 0
#define VERTICAL 1
#define HORIZONTAL 0
 
#define STEER_LEFT 1
#define STEER_RIGHT -1
#define STRAIGHT 0
 
#define CAMX 670
#define CAMY 120
#define MAPX 8
#define MAPY 113
 
#define FREE 0
#define STOP 1
#define CAR 2
 
/*data types*/
 
typedef struct car_d {
int number;
float xpos,ypos;
int xp,yp;
float dist_obs,dist_sem;
float speed,middle,front,rear,somma;
int angle,sat;
char collision,boom,correggi,incrocio;
char dir,running;
struct car_d *next;
} car_data;
 
typedef struct {
int x,y;
} point;
 
typedef struct {
char vpos,hpos,tl_name[8];
point l,r,u,d;
PID pid;
DWORD period;
} tl_data;
 
 
typedef struct {
int xpos,ypos,angles;
} starting_set;
/demos/branches/pj/simcity/include/misc.h
0,0 → 1,18
//*****************************misc.h************************************
// miscellaneous useful functions
#ifndef CST
#include "constant.h"
#endif
 
int my_rint(float);
void fill_table();
void tl_init();
void set_start_point();
int returnCarIndex(int);
int find_col(int,int);
int find_tl(int,int,int);
int allinea(int);
int module(int,int,int,int);
int normalize(int);
 
 
/demos/branches/pj/simcity/include/draw.h
0,0 → 1,14
//****************************draw.h*******************************
// drawing functions
#ifndef CST
#include "constant.h"
#endif
 
void drawSprites(int,int,char,char);
void drawStreet(int,int);
void get_images();
void drawCar(int,int,int,char);
void bold_rect(WORD,WORD,WORD,WORD,BYTE,BYTE,BYTE);
void draw_scenario();
void draw_tl(int x,int y,DWORD img[SH][SW]);
void drawFaces(int,int,short);
/demos/branches/pj/simcity/include/simcity.h
0,0 → 1,77
/********************************simcity.h***************************/
// global variables and tasks bodies declaration
 
#include <kernel/func.h>
#include <semaphor.h>
#ifndef CST
#include "constant.h"
#endif
 
/*Global stuff*/
 
extern car_data car_data_array[MAX_CAR];
extern tl_data tl_data_array[MAX_TL];
 
//car starting points
extern starting_set starting_set_array[S_POINT];
 
// PID vectors
extern PID p_table[MAX_CAR];
extern PID c_table[MAX_CAR];
extern PID g_table[MAX_CAR];
extern PID a_table[MAX_CAR];
 
extern char kill_flag[MAX_CAR];
//graphic mutex
extern sem_t mutex;
 
//kill_flag mutexes
extern sem_t kill_mutex[MAX_CAR];
 
//various sprites
extern DWORD macchine[ROW][COL][NCAR];
extern DWORD strada[H][W];
extern BYTE street[H*W*2];
extern BYTE vbuf[MAX_CAR][ROW*COL*2];
extern BYTE clrcam[(ROW+2)*(COL+2)*2];
extern BYTE gauge_img[ROW*COL*2];
extern BYTE brk_gauge[ROW*COL*2];
extern BYTE arrow[3][ROW*COL*2];
extern DWORD sprites[ROW][COL][NO_SPRITE];
extern BYTE clrscr[800*600*2];
extern DWORD faces[2][74][47];
 
extern char sens;
//sine & cosine look-up tables
extern float cosine[360],sine[360];
 
//traffic light sprites
extern DWORD y_sem[4][SH][SW];
extern DWORD r_sem[4][SH][SW];
extern DWORD g_sem[4][SH][SW];
 
//useful colors
extern DWORD white;
extern DWORD black;
extern DWORD red;
extern DWORD gray;
extern DWORD blue;
extern DWORD green;
extern DWORD border;
extern DWORD tl_bg;
 
//task chain pointers
extern car_data *free_n,*busy_n,*free_o,*busy_o;
// car counter
extern short maxc;
 
/*function declaration */
 
/* task bodies*/
TASK car(car_data *);
TASK traffic_light(tl_data *);
TASK camera(int);
TASK gauge_c(int);
TASK blink_arrow(int);
TASK refresher(void *);
TASK killer(void *);
/demos/branches/pj/simcity/include/states.h
0,0 → 1,21
enum stati {
NORM,
INC1,
DX1,
STR1,
STR2,
SX1,
SX2,
SX3
} ;
 
enum sprite_type {
EXPL,
GAUGE,
ARR_OFF,
ARR_SX,
ARR_DX,
VECCHINA,
V_SPLAT,
GAUGE_ROTTO
};
/demos/branches/pj/simcity/include/proc.h
0,0 → 1,23
//***************************proc.h******************************
// task management functions
#ifndef CST
#include "constant.h"
#endif
 
 
int add();
void del(int);
void init_struct();
int del_o();
void gauge_create(char *,int);
void arrow_create(char *,int);
void killer_create();
void ref_create();
void cam_create(char *,int);
void stl_create(char *,int);
void h_create(char *,int);
void s_create(char *,int);
void killing(int);
 
 
 
/demos/branches/pj/simcity/include/car.h
0,0 → 1,10
//*****************************car.h********************************
// car management functions
#ifndef CST
#include "constant.h"
#endif
 
char collision_sensor(car_data *);
int sensore(car_data *);
void ch_spd(car_data *,char);
 
/demos/branches/pj/simcity/include/keyfunct.h
0,0 → 1,10
/*******************************keyfunct.h****************************/
// keyboard handler functions
#include <drivers/keyb.h>
 
void h_car_create(KEY_EVT *);
void s_car_create(KEY_EVT *);
void h_car_kill(KEY_EVT *);
void endfun(KEY_EVT *);
void refresh(KEY_EVT *);
void sensor_switch(KEY_EVT *);
/demos/branches/pj/simcity/sem/green_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/red_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/yellow_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/red_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/red_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/yellow_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/yellow_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/green_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/green_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/green_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/red_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/sem/yellow_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/demos/branches/pj/simcity/proc.c
0,0 → 1,393
#include <drivers/glib.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "include/simcity.h"
#include "include/misc.h"
#include "include/proc.h"
 
int add() {
if(maxc>0 && maxc<MAX_CAR-1) {
busy_n->next=free_o;
busy_n=free_o;
free_o=free_o->next;
busy_n->next=NULL;
}
if(maxc==0) {
busy_n=busy_o=free_o;
free_o=free_o->next;
busy_n->next=NULL;
}
if(maxc==MAX_CAR-1) {
busy_n->next=free_o;
busy_n=free_o;
free_o=free_n=NULL;
busy_n->next=NULL;
}
if(maxc<MAX_CAR) {
maxc++;
return(busy_n->number);
} else
return(-1);
}
 
void del(int num) {
car_data *d,*db;
 
db=d=busy_o;
if(maxc>1) {
while((d->number)!=num) {
db=d;
d=d->next;
}
if(d==busy_n) {
db->next=NULL;
busy_n=db;
} else if(d==busy_o) {
busy_o=busy_o->next;
} else {
db->next=d->next;
}
if(maxc!=MAX_CAR) {
free_n->next=d;
free_n=d;
free_n->next=NULL;
}
else {
free_n=free_o=d;
}
}
else {
free_n->next=d;
free_n=d;
free_n->next=NULL;
busy_n=busy_o=NULL;
}
maxc--;
}
 
void init_struct() {
int i;
 
free_o=&(car_data_array[0]);
free_n=&(car_data_array[MAX_CAR-1]);
busy_n=busy_o=NULL;
for(i=0;i<MAX_CAR;i++)
car_data_array[i].number=i;
for(i=0;i<MAX_CAR;i++) {
if(i<MAX_CAR-1)
car_data_array[i].next=&(car_data_array[i+1]);
else
car_data_array[i].next=NULL;
}
maxc=0;
}
 
int del_o() {
 
if(maxc<MAX_CAR && maxc>1) {
free_n->next=busy_o;
free_n=busy_o;
busy_o=busy_o->next;
free_n->next=NULL;
} else
if(maxc==MAX_CAR) {
free_n=free_o=busy_o;
busy_o=busy_o->next;
free_n->next=NULL;
} else
if(maxc==1) {
free_n->next=busy_o;
free_n=busy_o;
free_n->next=NULL;
busy_o=busy_n=NULL;
}
if(maxc>0) {
maxc--;
return(free_n->number);
} else
return -1;
}
 
void gauge_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,GAUGE_WCET);
soft_task_def_period(stm,PERIOD_CAR);
soft_task_def_usemath(stm);
pid = task_create(name, gauge_c, &stm, NULL);
if (pid == NIL) {
grx_close();
perror("stl_create():Could not create task <Gauge_c>");
sys_abort(1);
}
g_table[num]=pid;
task_activate(pid);
}
 
 
void arrow_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,ARROW_WCET);
soft_task_def_period(stm,PERIOD_CAR*4);
pid = task_create(name,blink_arrow, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <arrow>");
sys_abort(1);
}
a_table[num]=pid;
task_activate(pid);
}
 
void killer_create() {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) 0;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,1000);
soft_task_def_period(stm,5*SECOND);
pid = task_create("killer", killer, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("ref_create():Could not create task <killer>");
sys_abort(1);
}
task_activate(pid);
}
 
 
void ref_create() {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) 0;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,3000);
soft_task_def_period(stm,4*SECOND);
pid = task_create("Refresher", refresher, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("ref_create():Could not create task <refresher>");
sys_abort(1);
}
task_activate(pid);
}
 
void cam_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,CAM_WCET);
soft_task_def_period(stm,PERIOD_CAR);
pid = task_create(name, camera, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <Camera>");
sys_abort(1);
}
c_table[num]=pid;
task_activate(pid);
}
 
void stl_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
strcpy(tl_data_array[num].tl_name,name);
par=(void *) &(tl_data_array[num]);
soft_task_def_arg(stm,par);
soft_task_def_met(stm,TL_WCET);
soft_task_def_period(stm,tl_data_array[num].period);
pid = task_create(name, traffic_light, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <Traffic Light>");
sys_abort(1);
}
tl_data_array[num].pid=pid;
task_activate(pid);
}
 
void h_create(char *name,int num) {
void *par;
PID pid;
int start_point=0;
short flag=0;
HARD_TASK_MODEL htm;
car_data cd,*d;
 
#ifdef POS_RAND
start_point=rand()%S_POINT;
if(busy_o!=NULL)
do {
flag=0;
d=busy_o;
do {
if(d->number!=num)
if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
start_point=(start_point+1)%S_POINT;
flag=1;
break;
}
d=d->next;
} while(d!=NULL);
} while(flag);
#endif
#ifndef POS_RAND
start_point=OBL_START;
#endif
 
cd.number=num;
cd.xpos=cd.xp=starting_set_array[start_point].xpos;
cd.ypos=cd.yp=starting_set_array[start_point].ypos;
cd.angle=starting_set_array[start_point].angles;
cd.speed=MIN_SPEED;
cd.dist_obs=MAX_DIST;
cd.collision=cd.boom=cd.correggi=cd.somma=0;
cd.dir=STRAIGHT;
car_data_array[num]=cd;
hard_task_default_model(htm);
hard_task_def_ctrl_jet(htm);
par=(void *) &(car_data_array[num]);
hard_task_def_arg(htm,par);
hard_task_def_wcet(htm, CAR_WCET);
hard_task_def_mit(htm,PERIOD_CAR);
hard_task_def_usemath(htm);
pid = task_create(name, car, &htm, NULL);
if (pid == NULL) {
grx_close();
perror("h_create():Could not create task <hard car>");
sys_abort(1);
}
else {
p_table[num]=pid;
sem_wait(&(kill_mutex[num]));
kill_flag[num]=0;
car_data_array[num].running=1;
sem_post(&(kill_mutex[num]));
task_activate(pid);
}
}
 
void s_create(char *name,int num) {
void *par;
PID pid;
int start_point=0;
SOFT_TASK_MODEL stm;
car_data cd,*d;
short flag=0;
 
#ifdef POS_RAND
start_point=rand()%S_POINT;
if(busy_o!=NULL)
do {
flag=0;
d=busy_o;
do {
if(d->number!=num)
if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
start_point=(start_point+1)%S_POINT;
flag=1;
break;
}
d=d->next;
} while(d!=NULL);
} while(flag);
#endif
#ifndef POS_RAND
start_point=OBL_START;
#endif
 
cd.number=num;
cd.xpos=cd.xp=starting_set_array[start_point].xpos;
cd.ypos=cd.yp=starting_set_array[start_point].ypos;
cd.angle=starting_set_array[start_point].angles;
cd.speed=MIN_SPEED;
cd.dist_obs=MAX_DIST;
cd.collision=cd.boom=cd.correggi=cd.somma=0;
cd.dir=STRAIGHT;
car_data_array[num]=cd;
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) &(car_data_array[num]);;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,SCAR_WCET);
soft_task_def_period(stm,SPERIOD_CAR);
soft_task_def_usemath(stm);
pid = task_create(name, car, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("h_create():Could not create task <soft car>");
sys_abort(1);
}
else {
p_table[num]=pid;
sem_wait(&(kill_mutex[num]));
kill_flag[num]=0;
car_data_array[num].running=1;
sem_post(&(kill_mutex[num]));
task_activate(pid);
}
}
 
void killing(int num) {
PID car_to_kill,cam_to_kill,gauge_to_kill,a_to_kill;
int c;
 
c=car_data_array[num].number*46;
car_to_kill=p_table[num];
cam_to_kill=c_table[num];
gauge_to_kill=g_table[num];
a_to_kill=a_table[num];
sem_wait(&(kill_mutex[num]));
kill_flag[num]=1;
car_data_array[num].running=0;
sem_post(&(kill_mutex[num]));
task_kill(car_to_kill);
task_kill(cam_to_kill);
task_kill(gauge_to_kill);
task_kill(a_to_kill);
sem_wait(&mutex);
grx_putimage(car_data_array[num].xp-15,car_data_array[num].yp-15,car_data_array[num].xp+14,car_data_array[num].yp+14,vbuf[car_data_array[num].number]);
grx_putimage(CAMX-1,CAMY-1+c,CAMX+30,CAMY+30+c,clrcam);
grx_putimage(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+c+30,clrcam);
grx_putimage(CAMX+80-1,CAMY-1+c,CAMX+80+30,CAMY+c+30,clrcam);
grx_text(" ",CAMX,CAMY+c+30,black,black);
sem_post(&mutex);
}
/demos/branches/pj/simcity/initfile.c
0,0 → 1,109
//****************************initfile.c*******************************
#define PI
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
 
#ifndef PI
#include "modules/rrsoft.h"
#endif
 
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include <drivers/keyb.h>
 
//#include "ll/i386/x-dos.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
//#define RRTICK 10000
#define RRTICK 2000
 
 
void getCars(void);
void getRoad(void);
void getSem(void);
void getSprites(void);
void getFaces(void);
void tl_pos();
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
 
// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
 
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
NOP_register_module();
 
getFaces();
getCars();
getRoad();
getSem();
getSprites();
tl_pos();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
kern_printf("TIME=%d\n",sys_gettime(NULL));
KEYB_init(NULL);
kern_printf("TIME=%d\n",sys_gettime(NULL));
KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
 
#ifdef PI
void app_mutex_init(mutex_t *m)
{
PI_mutexattr_t attr;
 
PI_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#else
void app_mutex_init(mutex_t *m)
{
NOP_mutexattr_t attr;
 
NOP_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#endif
/demos/branches/pj/simcity/car.c
0,0 → 1,175
#include <drivers/glib.h>
#include <stdlib.h>
#include <math.h>
#include "include/simcity.h"
#include "include/misc.h"
#include "include/car.h"
#include "include/draw.h"
 
char collision_sensor(car_data *cd) {
float i,dx,dx1,dy,dy1,deltax,deltay;
int colore,colore1;
int speed_done=0;
char col=FREE;
 
dx=cd->xpos+2.0*cosine[normalize(cd->angle+90)];
dy=cd->ypos-2.0*sine[normalize(cd->angle+90)];
dx1=cd->xpos-8.0*cosine[normalize(cd->angle+90)];
dy1=cd->ypos+8.0*sine[normalize(cd->angle+90)];
 
for (i=0.0;i<MAX_LOOK;i+=0.1) {
deltax=i*cosine[normalize(cd->angle)];
deltay=i*sine[normalize(cd->angle)];
sem_wait(&mutex);
colore=grx_getpixel(my_rint(dx+deltax),my_rint(dy-deltay));
colore1=grx_getpixel(my_rint(dx1+deltax),my_rint(dy1-deltay));
sem_post(&mutex);
if (((colore==white)||(colore1==white) || ((colore==red)||(colore1==red)))) {
if((colore==white)||(colore1==white))
col=STOP;
else
col=CAR;
cd->dist_obs=i;
cd->collision=1;
speed_done=1;
}
if (!speed_done) {
if (sens) {
sem_wait(&mutex);
grx_plot(my_rint(dx+deltax),my_rint(dy-deltay),gray);
grx_plot(my_rint(dx1+deltax),my_rint(dy1-deltay),gray);
sem_post(&mutex);
}
}
}
if (!speed_done) {
cd->collision=0;
cd->dist_obs=MAX_LOOK;
}
return col;
}
 
int sensore(car_data *cd) {
int col_front,col_rear,col_middle;
int done_front=0,done_rear=0,done_middle=0;
float front,rear,middle,store_middle;
int angolo;
float i;
float x1,y1,x05,y05;
float xs,ys,xs1,ys1;
float coordx,coordy,distx,disty;
 
cd->front=cd->rear=cd->middle=front=rear=middle=store_middle=NORM_DIST;
x1=cd->xpos-10.0*cosine[normalize(cd->angle)]; // coordinata sensore dietro
y1=cd->ypos+10.0*sine[normalize(cd->angle)];
 
x05=cd->xpos-5.0*cosine[normalize(cd->angle)]; // coordinata sensore mezzo
y05=cd->ypos+5.0*sine[normalize(cd->angle)];
 
for (i=0.0;i<MAX_DIST;i+=0.1) {
coordx=i*cosine[normalize(cd->angle-LOOK_ANGLE)];
coordy=i*sine[normalize(cd->angle-LOOK_ANGLE)];
distx=i*cosine[normalize(cd->angle-DIST_ANGLE)];
disty=i*sine[normalize(cd->angle-DIST_ANGLE)];
col_front=grx_getpixel(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy));
col_rear=grx_getpixel(my_rint(x1+coordx),my_rint(y1-coordy));
col_middle=grx_getpixel(my_rint(x05+distx),my_rint(y05-disty));
if ((col_front==border) && !done_front) {
done_front=1;
cd->front=front=i;
}
if ((col_middle==border) && !done_middle) {
done_middle=1;
middle=cd->middle=i;
}
if ((col_rear==border) && !done_rear) {
done_rear=1;
cd->rear=rear=i;
}
if (sens) {
sem_wait(&mutex);
if (!done_front) {
grx_plot(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy),gray);
}
if (!done_rear) {
grx_plot(my_rint(x1+coordx),my_rint(y1-coordy),blue);
}
if (!done_middle) {
grx_plot(my_rint(x05+distx),my_rint(y05-disty),green);
}
sem_post(&mutex);
}
}
 
if (!done_front) {
front=cd->front=MAX_DIST;
}
if (!done_rear) {
rear=cd->rear=MAX_DIST;
}
if (!done_middle) {
cd->middle=middle=MAX_DIST;
}
xs=cd->xpos+front*cosine[normalize(cd->angle-LOOK_ANGLE)];
xs1=x1+rear*cosine[normalize(cd->angle-LOOK_ANGLE)];
ys=cd->ypos-front*sine[normalize(cd->angle-LOOK_ANGLE)];
ys1=y1-rear*sine[normalize(cd->angle-LOOK_ANGLE)];
if (xs==xs1) {
angolo=90;
} else {
angolo=my_rint(RAD_TO_DEG(atan((-ys1+ys)/(xs1-xs))));
}
 
if (angolo<0) angolo+=360;
if (angolo>=360) angolo-=360;
 
if ((ys-ys1<0) && (xs1-xs>0)) {
angolo-=180;
}
if ((ys-ys1>=0) && (xs1-xs>0)) {
angolo+=180;
}
 
if ((xs1-xs==0) && (ys-ys1>0)) {
angolo=270;
}
 
if (abs(middle-NORM_DIST)>FRANTIC) {
cd->correggi=1;
} else {
cd->somma=0;
cd->correggi=0;
}
 
if (cd->correggi) {
if (middle>NORM_DIST) {
cd->somma-=CORR_FACT;
}
if (middle<NORM_DIST) {
cd->somma+=CORR_FACT;
}
}
angolo+=cd->somma;
return angolo;
}
 
void ch_spd(car_data *cd,char ob_type) {
float set_spd=0.0;
float bf;
 
if(cd->collision) {
if(ob_type==STOP)
bf=0.001;
else
bf=0.7;
set_spd=cd->speed-(MAX_LOOK-cd->dist_obs)*bf;
if(set_spd<0)
set_spd=0;
}
else {
set_spd=cd->speed+0.4;
if(set_spd>MAX_SPEED)
set_spd=MAX_SPEED;
}
cd->speed=set_spd;
}
/demos/branches/pj/simcity/reading.c
0,0 → 1,237
/********************************************reading.c******************************/
#include <kernel/func.h>
#include <drivers/glib.h>
#include <ll/i386/x-dos.h>
#include <stdlib.h>
#include <string.h>
#include "include/constant.h"
#define rgb rgb16
 
DWORD macchine[ROW][COL][NCAR];
DWORD strada[H][W];
DWORD sprites[ROW][COL][NO_SPRITE];
DWORD y_sem[4][SH][SW];
DWORD r_sem[4][SH][SW];
DWORD g_sem[4][SH][SW];
DWORD faces[2][74][47];
extern tl_data tl_data_array[MAX_TL];
 
char nomefile[17];
char nomestrada[17];
char nomesem[17];
char nomesprite[16];
 
void getSem() {
int i,j,k,count;
BYTE colore[3];
DOS_FILE *fp;
char letter[5];
 
strcpy(letter,"lrud");
strcpy(nomesem,"sem/green_ .raw");
 
//green traffic light....
for(k=0;k<4;k++) {
nomesem[10]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
g_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
 
//red traffic light...
strcpy(nomesem,"sem/red_ .raw");
for(k=0;k<4;k++) {
nomesem[8]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
r_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
 
//yellow traffic light...
strcpy(nomesem,"sem/yellow_ .raw");
for(k=0;k<4;k++) {
nomesem[11]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
y_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
 
void getCars() {
int i,j,k,l,index;
int tmp;
char id_car[3];
BYTE colore[3];
DOS_FILE *fp;
 
strcpy(nomefile,"img/car_XXXn.raw");
k=0;
for (index=0;index<360;index+=15) {
tmp=index;
for (l=2;l>=0;l--) {
id_car[l]=tmp%10+'0';
tmp/=10;
}
nomefile[8]=id_car[0];
nomefile[9]=id_car[1];
nomefile[10]=id_car[2];
fp=DOS_fopen(nomefile,"r");
if (!fp) {
perror(nomefile);
sys_abort(1);
}
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
macchine[i][j][k]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
k++;
}
}
 
void getRoad() {
DOS_FILE *fp;
int i,j,test;
BYTE colore[3];
 
strcpy(nomestrada,"img/street.raw");
fp=DOS_fopen(nomestrada,"r");
if (!fp) {
perror(nomestrada);
sys_abort(1);
}
 
for (i=0;i<H;i++) {
for (j=0;j<W;j++) {
test=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(test!=3) {
perror("Few bytes read!!!!!!\n");
 
}
strada[i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
}
 
void getSprites(void) {
int i,j,k;
DOS_FILE *fp;
BYTE colore[3];
 
strcpy(nomesprite,"sprite/sp_X.raw");
for (k=0;k<NO_SPRITE;k++) {
nomesprite[10]=k+'0';
fp=DOS_fopen(nomesprite,"r");
if (!fp) {
perror(nomesprite);
sys_abort(1);
}
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
sprites[i][j][k]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
 
void tl_pos(void) {
DOS_FILE *fp;
int i;
char buf[7];
int dimx,dimy;
 
fp=DOS_fopen("sem.raw","r");
if (!fp) {
perror("sem.raw");
sys_abort(1);
}
buf[6]='\0';
for (i=0;i<MAX_TL;i++) {
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].u.x=dimx;
tl_data_array[i].u.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].d.x=dimx;
tl_data_array[i].d.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].l.x=dimx;
tl_data_array[i].l.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].r.x=dimx;
tl_data_array[i].r.y=dimy;
}
DOS_fclose(fp);
}
 
void getFaces(void) {
int i,j,k;
DOS_FILE *fp;
BYTE colore[3];
 
strcpy(nomesprite,"img/bbX.raw");
for (k=0;k<2;k++) {
nomesprite[6]=k+'0';
fp=DOS_fopen(nomesprite,"r");
if (!fp) {
perror(nomesprite);
sys_abort(1);
}
for (i=0;i<74;i++) {
for (j=0;j<47;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
faces[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
/demos/branches/pj/simcity/simcity.c
0,0 → 1,182
/************************** Simcity ************************/
// Main,initialization functions and global variables allocation
#include <kernel/func.h>
#include <string.h>
#include <stdlib.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
#include <kernel/kern.h>
#include <semaphor.h>
#include <math.h>
#include "include/constant.h"
#include "include/misc.h"
#include "include/draw.h"
#include "include/proc.h"
#define rgb rgb16
 
/* graphic mutex... */
sem_t mutex;
//kill flag mutexes
sem_t kill_mutex[MAX_CAR];
 
// various sprites to use with grx_putimage()....
BYTE vbuf[MAX_CAR][ROW*COL*2];
BYTE clrscr[800*600*2];
BYTE clrcam[(ROW+2)*(COL+2)*2];
BYTE gauge_img[ROW*COL*2];
BYTE brk_gauge[ROW*COL*2];
BYTE arrow[3][ROW*COL*2];
BYTE street[H*W*2];
 
//task chain pointers
car_data *free_n,*free_o,*busy_n,*busy_o;
 
// various sprites to plot
extern DWORD macchine[ROW][COL][NCAR];
extern DWORD sprites[ROW][COL][NO_SPRITE];
extern DWORD strada[H][W];
 
//resolution to use
WORD r=600;
WORD c=800;
BYTE bpp=16;
 
// useful colors...
DWORD white;
DWORD black;
DWORD red;
DWORD gray;
DWORD blue;
DWORD green;
DWORD border;
DWORD tl_bg;
 
//PID vectors
 
PID p_table[MAX_CAR];
PID c_table[MAX_CAR];
PID g_table[MAX_CAR];
PID a_table[MAX_CAR];
 
char kill_flag[MAX_CAR];
float cosine[360],sine[360];
 
// data structures
car_data car_data_array[MAX_CAR];
tl_data tl_data_array[MAX_TL];
starting_set starting_set_array[S_POINT];
 
void keyb_h(void);
 
static void version( void )
{
cprintf("\n\nDemo presented by\n");
cprintf("Aguzzi Marco\n");
cprintf(" &\n");
cprintf("Ferrari Fabio\n");
}
 
void demo_exc_handler(int signo, siginfo_t *info, void *extra)
{
struct timespec t;
 
grx_close();
/* Default action for an kern exception is */
kern_cli();
ll_gettime(TIME_EXACT, &t),
kern_printf("\nS.Ha.R.K. Exception raised!!!"
"\nTime (s:ns) :%d:%d"
"\nException number:%d"
"\nPID :%d\n",
t.tv_sec, t.tv_nsec, info->si_value.sival_int,
info->si_task);
sys_end();
}
 
void my_close(void *arg)
{
grx_close();
kern_printf("Shutting down SIMCITY\n");
}
 
int main(int argc, char **argv)
{
int i;
char tl_name[4];
struct sigaction action;
 
version();
 
/* Init the standard Hartik exception handler */
/* Set the signal action */
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = demo_exc_handler;
action.sa_handler = 0;
sigfillset(&action.sa_mask); /* we block all the other signals... */
if (sigaction(SIGHEXC, &action, NULL) == -1) {
perror("Error initializing signals...");
sys_end();
}
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
//resetting kill flags
for(i=0;i<MAX_CAR;i++) {
p_table[i]=0;
kill_flag[i]=0;
}
 
// graphic mode initialization
#ifdef GRAPH
if (grx_init() < 1) {
kern_printf("Error initializing graphics\n");
sys_abort(1);
}
if (grx_open(c,r,bpp) < 0) {
kern_printf("GRX Open Err\n");
sys_abort(1);
}
get_images();
#endif
srand(sys_gettime(NULL));
 
//init the graphic mutex
sem_init(&mutex,1,1);
//init kill flag mutexes
for(i=0;i<MAX_CAR;i++) sem_init(&(kill_mutex[i]),1,1);
//fill sine & cosine lookup tables
fill_table();
/*init keys*/
keyb_h();
set_start_point();
tl_init();
init_struct();
 
/* useful colors ... */
white = rgb(255,255,255);
black = rgb(0,0,0);
red = rgb(255,0,0);
gray = rgb(210,210,210);
blue = rgb(0,0,220);
green = rgb(0,255,0);
border= rgb(128,128,128);
tl_bg= rgb(0,128,0);
#ifdef GRAPH
/* paint scenario*/
draw_scenario();
#endif
#ifndef GRAPH
cprintf("Main: max_tl:%d\n",MAX_TL);
#endif
 
//creating refresher,killer and traffic light processes...
ref_create();
killer_create();
for(i=0;i<MAX_TL;i++) {
sprintf(tl_name,"tl%d",i+1);
#ifndef GRAPH
cprintf("main:tname=%s",tl_name);
#endif
stl_create(tl_name,i);
}
return 0;
}
/demos/branches/pj/simcity/sprite/sp_6.raw
0,0 → 1,23
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿ
ÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
/demos/branches/pj/simcity/sprite/sp_7.raw
0,0 → 1,0
vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXYXÜÛÜÚÝÚÚÛÚÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÙÛÙÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÙÛÙÙÝÙÞÛÞÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÞÛÞÚÝÚÜÛÜÞÜÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÞÛÞÙÛÙÜÝÜÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÜÛÜÙÜÙÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±ÜÛÜÙÛÙÞÛÞÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙÙÛÙXYXsts¦¥¦ONO‚MNMÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
/demos/branches/pj/simcity/sprite/sp_0.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿ€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿ€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€
/demos/branches/pj/simcity/sprite/sp_1.raw
0,0 → 1,0
vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÛÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÞÝÞÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞÙÛÙXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXWXXYXÜÛÜÚÝÚÚÛÚ*+*ÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÜÞÞÛÞÙÛÙÞÛÞÙÛÙ,+,ÚÝÚÜÛÜÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÚÛÚÙÛÙÞÛÞÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜÚÝÚÞÜÞsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÞÝÞÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÜÛÜÚÜÚÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÝÙÞÛÞÚÛÚÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÞÛÞÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÞÝÞÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÜÛÜÞÜÞÙÛÙÞÛÞÞÛÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÚÛÚÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÙÛÙÞÛÞÙÛÙÜÝÜÚÛÚÙÛÙÜÛÜÚÛÚÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÚÛÚÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÞÛÞÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÚÛÚÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÚÝÚÜÛÜÙÜÙÞÛÞÜÛÜÚÛÚÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÚÛÚÜÛÜXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±XWXÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙXWX…ƒ…,,,ÙÛÙXYXsts¦¥¦ONO‚MNMÞÝÞÙÛÙÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÚÛÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
/demos/branches/pj/simcity/sprite/sp_2.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/demos/branches/pj/simcity/sprite/sp_3.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/demos/branches/pj/simcity/sprite/sp_4.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/demos/branches/pj/simcity/sprite/sp_5.raw
0,0 → 1,26
ÿÿÿÿ
ÿÿÿÿÿÿ
ÿÀÿÿÀÿÿÀÿÿÀÿ
ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
@@@@@@
@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
/demos/branches/pj/simcity/tasks.c
0,0 → 1,409
//*******************************tasks.c************************************
// task bodies
#include <drivers/glib.h>
#include <stdlib.h>
#include <string.h>
#include <kernel/func.h>
#include <drivers/glib.h>
#include <semaphor.h>
#include <math.h>
#include "include/simcity.h"
#include "include/states.h"
#include "include/draw.h"
#include "include/misc.h"
#include "include/car.h"
#include "include/proc.h"
#define rgb rgb16
 
/*extern starting_set starting_set_array[S_POINT];
extern short maxc; */
 
TASK killer(void *arg) {
short i,j=0;
DWORD col[3];
char flag=0;
 
col[0]=red;
col[1]=green;
col[2]=white;
 
while(1) {
if(maxc>0) {
for(i=0;i<MAX_CAR;i++) {
sem_wait(&(kill_mutex[i]));
if(car_data_array[i].boom && car_data_array[i].running) flag=1;
else flag=0;
sem_post(&(kill_mutex[i]));
if(flag) {
del(i);
killing(i);
}
}
}
j=(j+1)%3;
sem_wait(&mutex);
grx_text("Killer active!",CAMX,CAMY+MAX_CAR*46,col[j],black);
sem_post(&mutex);
task_endcycle();
}
}
 
 
TASK refresher(void *arg) {
int i;
tl_data *d;
 
while(1) {
sem_wait(&mutex);
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
for(i=0;i<MAX_TL;i++) {
d=&(tl_data_array[i]);
if((d->vpos=='g')) {
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
} else if(d->vpos=='y') {
draw_tl(d->u.x,d->u.y,y_sem[U]);
draw_tl(d->d.x,d->d.y,y_sem[D]);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
} else if(d->hpos=='g') {
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
} else if(d->hpos=='y') {
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,y_sem[L]);
draw_tl(d->r.x,d->r.y,y_sem[R]);
}
}
sem_post(&mutex);
task_endcycle();
}
}
 
TASK blink_arrow(int number) {
char ld=0,prev=0,dir=0;
short c;
BYTE *arrow_img;
 
c=number*46;
while(1) {
if(kill_flag[number]) {
return 0;
}
if(!car_data_array[number].boom) {
dir=car_data_array[number].dir+1;
if(dir==prev) {
ld=(ld+1)%2;
if(ld==1)
arrow_img=arrow[(int)dir];
else
arrow_img=arrow[1];
 
sem_wait(&mutex);
grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow_img);
sem_post(&mutex);
} else {
prev=dir;
ld=0;
sem_wait(&mutex);
grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow[(int)dir]);
sem_post(&mutex);
}
}
task_endcycle();
}
}
 
 
TASK gauge_c(int number) {
int c;
float angle,ro;
int x,y;
char vel[5];
 
c=number*46;
while(1) {
if(kill_flag[number]) {
return 0;
}
if(!car_data_array[number].boom) {
angle=180.0*car_data_array[number].speed/MAX_SPEED;
sprintf(vel,"%.1f",car_data_array[number].speed);
ro=9.0;
y=my_rint(ro*sine[my_rint(angle)]);
x=my_rint(ro*cosine[my_rint(angle)]);
sem_wait(&mutex);
grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,gauge_img);
grx_line(CAMX+14,CAMY-1+c+25,CAMX+14-x,CAMY-1+c+25-y,blue);
grx_text(vel,CAMX,CAMY+c+30,white,black);
sem_post(&mutex);
} else {
sem_wait(&mutex);
grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,brk_gauge);
sem_post(&mutex);
}
task_endcycle();
}
}
 
TASK camera(int number) {
int c;
 
c=number*46;
grx_rect(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+30+c,green);
while(1) {
if(kill_flag[number]) {
return 0;
}
sem_wait(&mutex);
grx_putimage(CAMX+40,CAMY+c,CAMX+40+29,CAMY+c+29,vbuf[number]);
sem_post(&mutex);
task_endcycle();
}
}
 
TASK traffic_light(tl_data *d) {
char hpos,vpos,flag;
 
flag=0;
vpos=d->vpos;
if(vpos=='g') {
hpos='r';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
sem_post(&mutex);
#endif
} else {
vpos='r';
hpos='g';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
sem_post(&mutex);
#endif
}
task_endcycle();
while(1) {
if(vpos=='g') {
vpos='y';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->u.x,d->u.y,y_sem[U]);
draw_tl(d->d.x,d->d.y,y_sem[D]);
sem_post(&mutex);
#endif
}
if((vpos=='y')&&(!flag)) {
vpos='r';
hpos='g';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
sem_post(&mutex);
#endif
}
if((vpos=='r')&&(!flag)) {
if(hpos=='g') {
hpos='y';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,y_sem[L]);
draw_tl(d->r.x,d->r.y,y_sem[R]);
sem_post(&mutex);
#endif
}
if((hpos=='y')&&(!flag)) {
hpos='r';
vpos='g';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
sem_post(&mutex);
#endif
}
}
flag=0;
d->vpos=vpos;
d->hpos=hpos;
#ifndef GRAPH
sem_wait(&mutex);
cprintf("semaforo %s: verticale:%c orizz.:%c\n",d->tl_name,vpos,hpos);
sem_post(&mutex);
#endif
task_endcycle();
}
}
 
TASK car(car_data *cd) {
char ob_type=FREE;
int start_point,sat_angle=0;
int tl=0;
short stato=NORM,dir_flag=0;
 
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
while(1) {
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
if(cd->xp>630||cd->yp>590||cd->xp<18||cd->yp<MAPY+3) {
start_point=rand()%S_POINT;
if(start_point==2)
start_point++;
cd->xpos=cd->xp=starting_set_array[start_point].xpos;
cd->ypos=cd->yp=starting_set_array[start_point].ypos;
cd->angle=starting_set_array[start_point].angles;
}
if (!cd->boom) {
// Control State Machine
if(stato==NORM) {
cd->dir=STRAIGHT;
ob_type=collision_sensor(cd);
ch_spd(cd,ob_type);
if(cd->dist_obs<30 && ob_type==STOP) {
stato=INC1;
}
if(ob_type==FREE || cd->dist_obs>=27 || cd->speed>=2.0) {
cd->angle=sensore(cd);
cd->angle=normalize(cd->angle);
}
}
if(stato==INC1) {
tl=find_tl(cd->angle,cd->xp,cd->yp);
if(!dir_flag)
cd->dir=rand()%3-1;
if(find_col(cd->angle,tl)=='g') {
switch(cd->dir) {
case STEER_RIGHT:
stato=DX1;
break;
case STRAIGHT:
case STEER_LEFT:
stato=STR1;
break;
default:
stato=DX1;
}
} else {
cd->speed=0.0;
dir_flag=1;
}
}
if(stato==DX1) {
dir_flag=0;
cd->speed=4.0;
cd->angle=sensore(cd);
if(ob_type!=STOP)
stato=NORM;
else {
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
}
}
if(stato==STR1) {
dir_flag=0;
cd->angle=allinea(cd->angle);
sensore(cd);
cd->speed=4.0;
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
if(cd->middle==MAX_DIST) {
if(cd->dir==STRAIGHT)
stato=STR2;
else {
sat_angle=cd->angle+90;
stato=SX1;
}
}
}
if(stato==STR2) {
cd->speed=4.0;
sensore(cd);
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
stato=NORM;
}
if(stato==SX1) {
cd->speed=4.0;
sensore(cd);
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
else {
cd->angle+=7;
if(cd->angle>=sat_angle) {
cd->angle=sat_angle;
}
}
if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
stato=NORM;
}
}
if (cd->dist_obs<COLL_DIST && ob_type==CAR) {
cd->boom=1;
cd->speed=0.0;
}
sem_wait(&mutex);
grx_getimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
if (cd->boom==0) {
drawCar(cd->xp,cd->yp,cd->angle,DRAW);
}
if (cd->boom==1) {
drawSprites(cd->xp,cd->yp,0,DRAW);
}
sem_post(&mutex);
task_endcycle();
sem_wait(&mutex);
if (cd->boom==0) {
grx_putimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
} else {
drawSprites(cd->xp,cd->yp,0,CANCEL);
}
sem_post(&mutex);
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
cd->xpos+=cd->speed*cos(DEG_TO_RAD(cd->angle));
cd->ypos-=cd->speed*sin(DEG_TO_RAD(cd->angle));
cd->xp=my_rint(cd->xpos);
cd->yp=my_rint(cd->ypos);
}
}
/demos/branches/pj/simcity/keyfunct.c
0,0 → 1,85
/**************** Functions called by keyboard handler*********/
#include <drivers/keyb.h>
#include <drivers/glib.h>
#include <drivers/glib.h>
#include <stdlib.h>
#include <string.h>
#include "include/simcity.h"
#include "include/proc.h"
 
short maxc=0;
char sens=0;
 
extern starting_set starting_set_array[S_POINT];
 
void h_car_create(KEY_EVT *k)
{
char name[10];
int num;
 
if((maxc<MAX_CAR)) {
num=add();
if(num>=0) {
sprintf(name,"car%d",num);
h_create(name,num);
sprintf(name,"camera%d",num);
cam_create(name,num);
sprintf(name,"speed%d",num);
gauge_create(name,num);
sprintf(name,"arrow%d",num);
arrow_create(name,num);
}
}
}
 
void s_car_create(KEY_EVT *k)
{
char name[10];
int num;
 
if((maxc<MAX_CAR)) {
num=add();
if(num>=0) {
sprintf(name,"car%d",num);
h_create(name,num);
sprintf(name,"camera%d",num);
cam_create(name,num);
sprintf(name,"speed%d",num);
gauge_create(name,num);
sprintf(name,"arrow%d",num);
arrow_create(name,num);
}
}
}
 
void h_car_kill(KEY_EVT *k) {
int num;
 
if(maxc>0) {
num=del_o();
if(num>=0) {
killing(num);
}
}
}
 
void endfun(KEY_EVT *k)
{
grx_close();
cprintf("Brk command pressed! Ending...\n");
sys_end();
}
 
void refresh(KEY_EVT *k){
 
sem_wait(&mutex);
//heavy and obsolete.....
//draw_scenario();
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
sem_post(&mutex);
}
 
void sensor_switch(KEY_EVT *k) {
if(sens==0) sens=1;
else sens=0;
}
/demos/branches/pj/simcity/misc.c
0,0 → 1,215
#include <math.h>
#include "include/misc.h"
#include "include/simcity.h"
 
int my_rint(float num) {
return (int)floor(num+0.5);
}
 
void fill_table(void) {
int i;
for (i=0;i<360;i++) {
sine[i]=sin(DEG_TO_RAD(i));
cosine[i]=cos(DEG_TO_RAD(i));
}
}
 
void tl_init() {
//MAPX,MAPY
char col[2];
short i;
 
col[0]='r';
col[1]='g';
for(i=0;i<MAX_TL;i++) {
tl_data_array[i].vpos=col[i%2];
tl_data_array[i].period=(i+3)*SECOND;
tl_data_array[i].l.x+=MAPX;
tl_data_array[i].l.y+=MAPY;
tl_data_array[i].r.x+=MAPX;
tl_data_array[i].r.y+=MAPY;
tl_data_array[i].u.x+=MAPX;
tl_data_array[i].u.y+=MAPY;
tl_data_array[i].d.x+=MAPX;
tl_data_array[i].d.y+=MAPY;
}
}
 
void set_start_point() {
//MAPX,MAPY
starting_set_array[0].xpos=607+MAPX;
starting_set_array[0].ypos=20+MAPY;
starting_set_array[0].angles=180;
starting_set_array[1].xpos=12+MAPX;
starting_set_array[1].ypos=62+MAPY;
starting_set_array[1].angles=0;
starting_set_array[2].xpos=260+MAPX;
starting_set_array[2].ypos=460+MAPY;
starting_set_array[2].angles=90;
starting_set_array[3].xpos=605+MAPX;
starting_set_array[3].ypos=205+MAPY;
starting_set_array[3].angles=180;
}
 
int returnCarIndex(int a) {
int indice=-1;
int angle;
 
angle=normalize(a);
if (((angle>=0) && (angle<=8)) || ((angle>353) && (angle<360))) { // 0 (+8 ; -7)
indice=0;
}
if ((angle<=23) && (angle>8)) { // 15
indice=1;
}
if ((angle<=38) && (angle>23)) { // 30
indice=2;
}
if ((angle<=53) && (angle>38)) { // 45
indice=3;
}
if ((angle<=68) && (angle>53)) { // 60
indice=4;
}
if ((angle<=83) && (angle>68)) { // 75
indice=5;
}
if ((angle<=98) && (angle>83)) { // 90
indice=6;
}
if ((angle<=113) && (angle>98)) { // 105
indice=7;
}
if ((angle<=128) && (angle>113)) { // 120
indice=8;
}
if ((angle<=143) && (angle>128)) { // 135
indice=9;
}
if ((angle<=158) && (angle>143)) { // 150
indice=10;
}
if ((angle<=173) && (angle>158)) { // 165
indice=11;
}
if ((angle<=188) && (angle>173)) { // 180
indice=12;
}
if ((angle<=203) && (angle>188)) { // 195
indice=13;
}
if ((angle<=218) && (angle>203)) { // 210
indice=14;
}
if ((angle<=233) && (angle>218)) { // 225
indice=15;
}
if ((angle<=248) && (angle>233)) { // 240
indice=16;
}
if ((angle<=263) && (angle>248)) { // 255
indice=17;
}
if ((angle<=278) && (angle>263)) { // 270
indice=18;
}
if ((angle<=293) && (angle>278)) { // 285
indice=19;
}
if ((angle<=308) && (angle>293)) { // 300
indice=20;
}
if ((angle<=323) && (angle>308)) { // 315
indice=21;
}
if ((angle<=338) && (angle>323)) { // 330
indice=22;
}
if ((angle<=353) && (angle>338)) { // 345
indice=23;
}
if (angle==360) {
indice=0;
}
return indice;
}
 
int normalize(int angle) {
if(angle<0)
return ((angle+360));
if(angle>=360)
return ((angle-360));
return angle;
}
 
int module(int x1,int x2,int y1,int y2) {
int x,y;
 
x=x1-x2;
y=y1-y2;
x*=x;
y*=y;
return x+y;
}
 
int allinea(int angle) {
int old_angle;
 
old_angle=normalize(angle);
if(old_angle<45)
old_angle=0;
else if(old_angle<135)
old_angle=90;
else if(old_angle<225)
old_angle=180;
else
old_angle=270;
return old_angle;
}
 
int find_tl(int angle,int xp,int yp) {
int a,min_tl,old_min,mins,i;
 
a=allinea(angle);
min_tl=old_min=10000;
for(mins=i=0;i<MAX_TL;i++) {
switch(a) {
case 0:
min_tl=module( xp,tl_data_array[i].l.x, yp,tl_data_array[i].l.y);
break;
case 90:
min_tl=module( xp,tl_data_array[i].d.x, yp,tl_data_array[i].d.y);
break;
case 180:
min_tl=module( xp,tl_data_array[i].r.x, yp,tl_data_array[i].r.y);
break;
case 270:
min_tl=module( xp,tl_data_array[i].u.x, yp,tl_data_array[i].u.y);
break;
default:
break;
}
if(min_tl<old_min) {
old_min=min_tl;
mins=i;
}
}
return mins;
}
 
int find_col(int angle,int tl) {
int min_tl=0,a;
 
a=allinea(angle);
switch(a) {
case 0:
case 180:
min_tl=tl_data_array[tl].hpos;
break;
case 90:
case 270:
min_tl=tl_data_array[tl].vpos;
break;
}
return min_tl;
}
/demos/branches/pj/simcity/sem.raw
0,0 → 1,0
199146290278187261299163441142537285427269538166193318290431178423298324
/demos/branches/pj/simcity/img/car_000n.raw
0,0 → 1,0
€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€ÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€
/demos/branches/pj/simcity/img/Bb0.raw
0,0 → 1,0
ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZ9Rc„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBsZÿÞçÎçÎçÎçÎ99cJ)))ZޜçÎï΄Œ!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1kBïÎçÎçÎçÎçÎçÎçÎïÎïÎçÎïÖçÎçÎÿÞçÎïÎïÎsc)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZJscçÎïÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎïÖïÎïÎçÎçÎçÎçÎçÎÿÞïÎ{„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ZRçÎçÎçÎçÎçÆçÆçÎçÆçÆçÎ÷ÖïÎçÎïÎïÖïÎçÎçÎçÎçÎïÎçÎçÎçÎïČÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9B)!sZïÎçÎ÷ÖïÖçÎçÎçÆçÎçÆçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎïÖ9c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!1­”çÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÆçÎçÎçÎçÆïÎçÆçÎïÎçÎçÎçÎçÎçÎJBkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kïÎçÎçÎïÎçÆçÆçÎçÆçÆçÎçÆçÎïÎçÎçÆçÎçÎçÎçÎïÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎïÎksÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎRZkÿÞçÎçÎçÆçÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÆçÎçÎïÎçÎçÎçÆïÎçÎçÎçÎçÎçÎçέµRRZkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÎçÎçÎïÎçÎçÎçÎçÎçÎïÎçÆçÎçÎïք{!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ19ZïÎïÎçÎçÆçÆçÆçÎçÎçÆçÆçÆçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÆïÎçÎçÎçÎçÆçÆçÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÎïÎçÎçÎçÎçÎïÎçÆïÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎ99ÆÆÎÆÆÎÆÆÎÆÆÎ99BçÎçÎçÎçÆçÆÞ½çÎçÎçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÆçÎçÎçÎïÎçÎçÎïÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎ9çÎçÎçÎçÆçÆçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÆïÎçÎïÎçÎçÎïÎçÎçÎçÆçÎïÎçÎçÎçÎçÆçÆçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)ïÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÎïÎçÎçÎçÆçÎçÎçÎïÎçÆçÎçÎ19ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{JçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎçÆçÎïÎçÆçÎïÎçÆçÎçÆïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎïÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÎçÎçÆçÆçÎçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎçÆïÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçέ”ÆÆÎÆÆÎÆÆÎÆÆε„ïÎçÎïÎçÆçÆçÎçÎçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÎçÆçÎïÎçÎçÎçÎZRÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÎçÆçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎïÎçÆçÎçÎçÆçÎïÎçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎïÎçÎçÎçÎçÎRÆÆÎÆÆÎÆÆÎJZB¥{çÎçÎçÆçÆçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÆçÆçÎïÎïÖçÎçÎçÎïÎçÎ¥ÞÆÆÎÆÆÎÆÆÎ¥„çÎçÎçÆçÆçÆçÎçÎçÎçÆçÆçÆçÎçÎçÆçÎçÆçÆçÎçÎçÆïÎçÆïÎçÎïÎçÎçÆçÆçÎçÆçÆïÎïÖÞÎçÎçÎïÎçÎçÎBJBkÆÆÎÆÆÎÆÆÎZskçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎ÷ÖçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçέ”ZJÞÎ÷ÖÿÞçÎBÆÆÎÆÆÎÆÆÎÆÆÎ!!JïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÎïÎÿÞçƽ¥çÎÆÆçÎçÎçÎïÎçÎçÎÆÆ1ïÎçÎçÎ1c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÆçÆÞ½çÎçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçČïÿ„ŒŒsïÎçÎ{JçÎçÎÆÆÿÞçÆç΄ŒÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kçÎçÎçÆçÆçÆÞÎçÎçÆÞÎÞ½çÎçÎçÎçÆçÎçÆçÎçÎkBïÿRsçÎ{„1sçÎçÎÆÆÞ½çÎçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎkBçÎçÎçÆÞ½çÆçÆçÎÞÎÞ½çÎçÎçÆçÎçÎçÆçÎç΄Œ1çÎïÖks„ŒçÎ{„)çÎçÎçΌsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÆçÆçÎÞÎçÆçÆçÎçÎçÆçÎçÆçÎçÎçÎRs!!{9J„kZk1JŒZJ!!1sc!sc!199BŒsZBk1J¥ŒÿZRZ9ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔkçÎçÎçÎçÆçÆçÆçÎçÆçÎçÆçÎçÎçÆçÎçÎ1ƄZç¥Rç¥Zç¥Zç¥Zï¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R­ŒsZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ¥{çÎçÆçÎçÆÞ½çÆÞ½çÎÞÎçÎçÆïÎçÎçÎ)֔Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆν¥ïÎÞ½çÎçÆçÆÞÎçÎçÎçÆçÆçÆçÎçÎ11ƄZç¥Zç¥Zç¥Jï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1”kçÎÞ½çÎçÆçÆçÆçÎçÎÞ½çÆïÎÆÆsç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥R֔ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎޜçÎçÆçÎçÆÞ½ÞÎÞÎçÎçÎçÆçÎÞ½œcBç¥Zç¥Rç¥Rï¥Zç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎÞ½çÎçÆçÎçÆçÎÞ½çÆçÆçÎçÎç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R”{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎÞ½çÎçÆÞ½çÎÞÎçÎçÎçÆçÎïÎç¥Zç¥Rç¥Rï¥Rç¥Rç¥Rç­Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥ZƔBBkZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÎçÎÞÎçÆÞ½çÎçÎçΌJ1ï¥Zç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rç¥Zç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎçÆçÎçÆçÆÞ½çÎçÎçÆçÆçÎç΄cBç¥Rï¥Jç¥Rç¥Zç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZRçÎÞ½çÆçÆÞ½çÎÞ½ÞÎçÆçÎçÎçÎç¥Rï¥Rç¥Jï¥Rï¥Zç¥Rç¥Rç¥Rç¥Zï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥RZJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎÞ½çÆÞ½çÎçÎçÎçÆçÎçÎçÎ֔Zï¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rï¥ZJ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎçÎÞ½çÆçÆÞÎÞ½ÞÎÞ½ïÎçÎçνsBï¥Rç¥Rï¥Rç¥Zk9¥{1ç¥Zï¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆçÆçÎçÎçÆÞÎçÆçÎçεk9ç¥Zç¥Rï¥Rï¥Rç¥R­ŒJsZ)֔Jï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Z¥{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆÞ½çÆÞÎÞ½çÎçÆçÆçÎçνsBç¥Rç¥Rç¥Rç¥Rï¥Rï¥Z­ŒJ!!½„1ÿ­Rï¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥RkRB9ckÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎÞ½çÆçÆçÆçÎçÆçÆïÎçÎçΜcBç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rÿ­R”{B1)Œc)ç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥ZkJ!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆÞ½Þ½çÎçÆçÎçÎçÎcç¥Zï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥ZBkZ)ƄZç¥Jç¥Rç¥Zç¥Rç¥Rç¥Rç¥RRBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎkç¥Zï¥Rç¥Rç¥Jç¥Rç¥Rç¥Jï¥Rç¥Rç¥Z”{B1!RB!ç¥Rç¥Zç¥Rç¥Zç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎŒsçÎçÎçÆçÎçÎçÎ1¥µŒ!ïÎ{1)ï¥Jç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥R„cBŒc!֔Jç¥Rç¥Rï¥RccJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)kBçÎçÎçÆçÎçÎïÎZJ„JJÿ1)BƄZï¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Jç¥Rç¥R”{B1)œs)ï¥RŒ„s19RJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ïÎçÎçÆçÎçÎ)BJ9RJBkRJJ1„cBï¥Jï¥Jç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥R­ŒJ¥kÿœ9ç¥Rç¥Rç¥Z”„R¥{BBB!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZZkçÎçÎçÎçÎçÎ9)kRBç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Zç¥Rï¥Zï¥R­ŒJcœÿÿœ9ç¥Rç¥Rï¥Zç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÎçÎB)kRBç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rï¥Zï¥Z”k9œœ„ÿÿÿµÖÿΌBç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ÷½çÎïÎçÎcï¥Zç¥Rç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rï¥R½„1ZskBkŒkcZççÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎ1))ç¥Rï¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥R֔J)!ZskœµÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎï¥Z1J)ç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zï¥Zç¥Zï¥Zç¥Rç¥Rï¥Rï¥Z­ŒJ„cBµ”cŒ„s)111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎ1ç¥Zç¥Rç¥Zç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Jï¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rï¥Zç¥Rç¥ZRJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBkŒkBçÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥Rç¥Rç¥Rç¥Rï¥Zç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rï¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZRç¥Zç¥Rç¥Jç¥Rç¥Rï¥Rç¥Rç¥R֔Jç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥R!!1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jï¥Zks9!!RZ1¥{Bç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥J„c!J!9sZ)ç¥Zç¥ZŒsZ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZskç¥Rç¥Zç¥Rç¥Rç¥Jï¥Zç¥ZsZ)”„RcJ)ç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥ZŒc!ccJBB!ç¥Rç¥Z„cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Jç¥Rç¥Rï¥Zç¥R­ŒJç¥Rks9ÿœ9ç¥Rç¥Rç¥Rç¥Zç¥R֔JB!ï¥Z1111!֔Jç¥Rç¥Z1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z)„R)ï¥Zï¥Jÿœ9ÿ­Rÿ­Rï¥R{c1cJ){c1µ”cŒsZ{c1΄9ç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Zç¥Rç¥RkRBJZZÞï÷sZ)”{B”s1΄!ÿ­Rÿœ9ï¥Rµ„BƜcµ”c19!!1µŒ!µ„BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rï¥Z֔JJZBZsksµÿ19ÿÿÿœœ„œs½„1ÿµRÿµRÿµR)ÆÆÎÆÆÎ1!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Z­ŒZ)BB1ÿÿÿ„ÿÿ1ÿÿÿ­ŒZç¥Zç¥Z99ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Rç¥Rç¥Rç¥R֔Jç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rç¥Z”„R)))!!!Œ½ÆJZB”„R„sJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Z֔Z1BB!1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!ç¥Rç¥Zç¥Rç¥Jç¥Jç¥Zç¥Zç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Z­ŒJkRB1)11!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R„{RBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R­ŒZ111JZZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)Z9ç¥Zç¥Rç¥Rç¥Z֔Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rï¥Jï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z„kZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Zç¥Jç¥Rç¥Zç¥Rç¥Rç¥R„c!BB!ÆÆÎ){Jç¥Rç¥Zç¥Rç­Zï¥Zç¥Rç¥Rç¥R¥s!ccZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥ZsZ)))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBRZcJ)µ„Bç¥Rç¥Rç¥Zï¥Zç¥RskBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Zï¥Rç¥Rç¥Rç¥Rœs)ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔk9ï¥Rç¥Zµ”c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBç¥Rç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ΄9÷Œ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥RkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
/demos/branches/pj/simcity/img/bb1.raw
0,0 → 1,0
ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc!)!911))111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ111J))91)Z))J)9))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJ)19!9!)Z)c19)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)JJ)c1)))!91)!!)91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9)J)1c1B1Z!J191)91))J))!!ZZZkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9!)c1J)J)c1B1)!!91)!)9)))9)J11)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9JB))J)Z)9)9))!J!9))))91)9)kcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ)1)1)J1Z)))J1)B1))91)!)91!!9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)1))1))9))!!J911))))1)J)!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ)))1)J)1)!!J))B191)1)!!9!)!cZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1JJ)k1B1)!9!9)JJ!))9))9!9)!!)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ9)9)Z)))J!9)1B1))1)9!)J!)!!!RB9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)J!J)1)Z)Z)))9!J11J)9!J!)9!Z)Z))Z)Z)B1)1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9!Z)))!9!)))))!J)919)J!!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)B11)J19!J)B1Z)c1)91)91)J9J))!!9))1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)19)J1J)J)!)J19)J9911)91)911)9)J)9!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))9!9)9))!J)c1))9)91911))J!)9)Jk1Z)9!!!!)!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))!J!9)9))ZB1))J1))91!!))))ç­Bï­B)))sB9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))9!)B1J!k1)J9J))))B19!)9!ç­Bç­Bç­Bç­Bç­Bç­Bç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)))sBc1sB1)­k!­c)1J1)B1))ç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­B1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)1)9!c1))ïœç­Bç­B)))J9)ç­Bç­Bç­Bç­J÷­Jç­Bç­Bç­Jç­B„RkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))çœ!ïœçœ!ç­Bç­Bç­Bÿ¥9))))))ç­Bç­Bç­Jç­Bï­Bç­JçµZç­Bç­Bç­Jç­B1B91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎB1k1ïœçœ!çœ!ç­Bç­Bï­Bç­Bç­Bç­B)))J9)ç­Bç­Bç­Bç¥9ç­Bç­Bç­Rïµkç­Bç­Bç­Bç­J))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1„Bçœ!ïœçœ!ç­Bç¥9ç¥9ç­Jç­Bç­Bç¥9ޔ!”c!„Rç­Jç­Bç­Bç­Bç¥9ç­Bç­Bç­Rç­Rïµsïµsç­Bç­B)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))΄çœ!çœ!ç­Bç¥9ç­Bç­Bç­Bç­Bç­Bç­Bï­Bç¥9Þ­Jï­Bï­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Rïµkïµkïµsç­BZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ï¥)ç¥9ç­Bç¥9ç­Bç­Jç­Bç­Bç¥9ç­Jç­Bï­Bç¥9ç­Bç­Jç­Bç­Bç­Jç­Bç­Bç­RçµZçµZçµsïµkïµkç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœï¥)ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Jç­Jç­Bç­JçµZÞ­cïµkïµkïµsïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!çœ1çœ1ç¥9ç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Bç­Jç­JçµZÞ­cïµsïµkïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!çœ1ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Jç¥9ç¥9ç­Jç­Bç­Jç­Jç­Bç­Bç­Jç­Rç­RïµkçµZçµsïµkïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ï¥)ç¥)çœ1ç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Jç­Jç­Rç­Jç­RçµZïµkïµsïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!÷œ!çœ1ç¥9ç­Bç­Bç­Bç­Bç¥9ç­Jç­Jç­Jç­Bï­Bç­Bç­Bç­Bç­Jç­Bç­Jç­Rç­JçµZçµZçµZÞ­cïµkïµkïµk!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœçœ1çœ1ç¥9ç¥9ç­Bç­Bç­J½œJ­Œ1ç­Bç­Jï­Bç­Bç­Bç­Bç­Bç­Jç­JÞ­J­”Rœ„B­ŒRÞ­cïµkïµkçµsïµk1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)çœ1ç­Bç­Bç­Bï­Bç­Js1Ö¥Bç­Bç­Bç­Jç­Rç­Jç­B½œJΜRï½kçµZïµkïµs)1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Jç­Bç­JÿÖRÿÿcç¥9ç­Bç­Jïµkç­RÞ­J„„B1kBJkB”kBÿÆcçµZÞ­kçµZïµsïµkB91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç­Bç­Bç¥9ÿ½JJ{B!ZB)c1ç¥9ç­Bç­RçµZç­RçµZ¥”B19!)çµZçµZïµkçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)ç¥9ç­Bç­Bç­Bÿ½J„BB1÷­Jç­Bç­RεkB1çµZµ”Bµ{JçµZçµZçµZÞ­kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Bç­Bç­Bÿ½J½œJsB)ï­Bç­Jç­J­­kçµZçµZçµZçµZÞ­kçµZïµkï½kçµZçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ksçœ!ïœç¥)ç¥9ç­Bç­Bç­Jç­Jï­Bÿ½Jÿ½Jÿ½Jç­Bç­Bï­Bµ­{9çµZçµZç­RçµZçµZçµZÞ­cÞ­kÞ­cçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç¥9ç­Bç­Jç­Jç­Bï­Bï­Bç­Bç­Bç­J½­sJJçµZçµZç­Rç­RçµZçµZï½kçµsçµZçµZçµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)çœ!çœ!ïœç¥)ç¥9ç­Jç­Jç­Bç­Bç­J÷­Jç­Jç­Jç­Bç­BÞ­ccZc!9çµZç­RçµZçµZÞ­cïµkçµsÞ­cçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)ç¥9ç­Bç­Jç­Bÿ½JÖ¥B))çµZç­Jç­Bç­Bç­R½­s„„B1)­ŒRçµZçµZÞ­kçµZçµZçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ޔޔ!Þ¥1ç¥9ç­B÷­JΜRœs1çµZçµZçµZçµZçµZçµZçµZçµZ{ŒJçµZÞ­cï½kçµZçµZçµZJkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRsçœ!ÿ”çœ!ïœçœ1ç¥9ç¥9ÿ½J„Bç­RçµZçµZÞ­cçµZçµZs„cçµZçµZÞ­kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJïœçœ!ïœç¥)Þ¥1ç¥9ÿ½J„BçµZçµZçµZœœk!ZBçµZçµZçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎR{{çœ!ïœޔ!çœ1ç¥9ç­J½œJµ”BŒc1÷­c)1Þ­kçµZçµZJJ”B)çµZçµZçµZçµZçµZïµkçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)Þ¥1ç­Bï­Bÿ½Jÿ½JÿÖR{9R!çµZµÞ­÷­JçµZçµZïµkÞ­cçµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœç¥)ç¥9ç¥9ç­Bç­BÞ¥B÷­J¥”BÿÞ¥„ZïµkçµZçµZçµZçµZï½kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1„Bçœ!ïœޔ!ç¥9Þ¥Bç­BÞ¥Bç­Bï­BÞ­Jc)9B)1÷­JçµZçµZÞ­cïµkïµkçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœï¥)çœ1ç¥9ç­Bç­Jç­Bç­BçµZçµZçµZçµZçµZçµZçµZçµZÞ­cÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!ç¥9ç¥9ç¥9ç¥9ç¥9çµZçµZçµZçµZçµZçµZçµZçµZï½kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!c„kç¥9ç¥9ç¥9ç¥9ç¥9¥{B1B!ksZcJ1çµZçµZçµZÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)ccïœçœ!½{!ç¥9ç¥9ç¥9¥”Bç¥9k{„s)Œc1çµZçµZï½kÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1çœ!„Rÿ”ç¥9Ö¥B­”RkZBB1cBc9Jÿÿÿ9BR„cB9RZ{JJ„sBçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9sBBJÿ”Ɣ11Zœ99)1{!)11J„9çµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!9{R½sÿ”ÿ¥9µ”B­”RŒs9cJ1­”RçµZçµZΜRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1çœ!ÿ”ÿ”ÿ¥9ÿ¥9ÿ¥9„„B)J1ZZ)BR)1))J1ZZ)ïµkçµZçµZï½k„sBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”ÿ”çœ1ï­Bÿ¥9ÿ½J¥”BŒs9sc)kk9„sB½œJçµZçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)ZœJÿ”ÿ”ï¥)ÿ¥9ï­B÷­J÷­J÷­Jÿ¥9÷­JçµZÿ½kÿ½kçµZçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”çœ!ç¥9ï­B÷­JçµZ÷­J÷­c÷­Jÿ½k÷Æ{÷Æ{ïµsÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœïœç¥9c)Œs9ïµsÞ­cÞ­cïµkïք­­k”„ZïµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)Zsÿ”çœ!ï¥)ZŒ9µ{Jç½{Þ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç­Bç¥9ç¥9ç¥9çµZçµZçµZïµkçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ïœç¥9ç­Jç­Jç­RçµZçµZÞ­kÞµsçµZçµZÞ­c1cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRskïœçœ!Þ¥1ç¥9Þ¥BÞ¥Bç­RÞ­cÞ­cïµkÞµsÞµsÞ­c­”RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!Þ¥1Þ¥1Þ¥BÞ­Jç­RçµZÞ­cÞ­kçµsÞµsçµZ­ŒR)J1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜJÿ”Þ”!ޔ!ç¥9ç­Rç­RçµZÞ­kÞ­kçµsÞµsçµZ”„Z111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJJÿ”Þ”Þ¥1Þ¥BÞ­Jç­RΜRïµkÞ­kÞµsç½{çµZŒc1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ޔ!ç¥9Ö¥BÞ­cÞ­cçµZïµkçµsç½{çµZ”kBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœޔ!çœ!Þ­Jç­RÞ­cÞ­cïµkïµsïµsçµZŒkJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœçœ!ïœÞ­cçµZÞ­cçµZÞ­cçµZçµZœ„B9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!çœ!çµZçµZçµZçµZçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ„cJ1çµZçµZÞ­kçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc9B)9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
/demos/branches/pj/simcity/img/car_120n.raw
0,0 → 1,0
€ÿÿÿÿÿ€ÀÀÀÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿ€€€€ÿ€€€€
/demos/branches/pj/simcity/img/car_210n.raw
0,0 → 1,0
€ÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿ€
/demos/branches/pj/simcity/img/car_300n.raw
0,0 → 1,0
€€€€ÿ€€€€ÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀ€ÿÿÿÿÿ€
/demos/branches/pj/simcity/img/car_030n.raw
0,0 → 1,0
€ÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿ€
/demos/branches/pj/simcity/img/street.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABÿÿÿBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
/demos/branches/pj/simcity/img/car_330n.raw
0,0 → 1,0
ÿ€ÿÿ€€€ÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€ÿÿÿ
/demos/branches/pj/simcity/img/car_015n.raw
0,0 → 1,0
€€€ÿ€€€ÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€ÿ€€€ÿ€ÿ€€€
/demos/branches/pj/simcity/img/car_240n.raw
0,0 → 1,0
€ÿ€€€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿ€
/demos/branches/pj/simcity/img/car_105n.raw
0,0 → 1,0
ÿÿÿÿÿÿ€ÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€
/demos/branches/pj/simcity/img/car_150n.raw
0,0 → 1,0
ÿÿÿ€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿ€€€ÿÿ€ÿ
/demos/branches/pj/simcity/img/car_060n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€€€ÿ€
/demos/branches/pj/simcity/img/car_225n.raw
0,0 → 1,0
€€€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÀÀÀ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€
/demos/branches/pj/simcity/img/car_270n.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
/demos/branches/pj/simcity/img/car_180n.raw
0,0 → 1,0
€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿ€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€
/demos/branches/pj/simcity/img/car_135n.raw
0,0 → 1,0
ÿÿÿ€ÿÿÿÿÿÿ€€€ÀÀÀ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€€€ÿ€€€€€€
/demos/branches/pj/simcity/img/old_sk.raw
0,0 → 1,23
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿ
ÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
/demos/branches/pj/simcity/img/car_090n.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÿÿÿÀÀÀÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ€ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿ€€ÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿ€€ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/demos/branches/pj/simcity/img/car_315n.raw
0,0 → 1,0
€€€€€€ÿ€€€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿ€ÿÿÿ
/demos/branches/pj/simcity/img/car_045n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€€€
/demos/branches/pj/simcity/img/car_255n.raw
0,0 → 1,0
ÿÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€
/demos/branches/pj/simcity/img/car_075n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿÿ
/demos/branches/pj/simcity/img/car_165n.raw
0,0 → 1,0
€€€ÿÿÿÿ€€€ÿ€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿ€ÿ€€€ÿ€
/demos/branches/pj/simcity/img/car_345n.raw
0,0 → 1,0
€ÿ€€€ÿ€ÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€ÿ€€€ÿÿÿÿ€€€
/demos/branches/pj/simcity/img/old.raw
0,0 → 1,26
ÿÿÿÿ
ÿÿÿÿÿÿ
ÿÀÿÿÀÿÿÀÿÿÀÿ
ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
@@@@@@
@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
/demos/branches/pj/simcity/img/car_285n.raw
0,0 → 1,0
€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿ€ÿÿÿÿÿÿ
/demos/branches/pj/simcity/img/car_195n.raw
0,0 → 1,0
€€€ÿ€ÿ€€€ÿ€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿ€€€ÿ€€€
/demos/branches/pj/simcity/makefile
0,0 → 1,15
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= simcity
 
include $(BASE)/config/example.mk
 
simcity:
make -f $(SUBMAKE) APP=simcity INIT= OTHEROBJS="initfile.o keyboard.o keyfunct.o tasks.o reading.o misc.o draw.o proc.o car.o"
/demos/branches/pj/simcity/draw.c
0,0 → 1,139
#include <drivers/glib.h>
#include "include/draw.h"
#include "include/simcity.h"
#include "include/states.h"
#include "include/misc.h"
#define rgb rgb16
 
void draw_tl(int x,int y,DWORD img[SH][SW]) {
int i,j;
 
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
//if(img[i][j]==tl_bg) continue;
grx_plot(x+j,y+i,img[i][j]);
}
}
}
 
void draw_scenario() {
char msg1[35];
int color,fbg;
 
color=rgb(235,235,235);
fbg=rgb(198,198,206);
grx_putimage(0,0,799,599,clrscr);
bold_rect(0,0,300,100,0,0,(255-120));
bold_rect(656,102,799,599,(254-120),(255-120),0);
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
bold_rect(0,102,655,599,0,0,(255-120));
bold_rect(301,0,799,100,(255-120),0,0);
grx_box(308,8,791,92,fbg);
grx_text("Alt + x , Enter -> Stop SIMCITY",10,10,color,black);
sprintf(msg1,"c -> Create a new hard car (max %d)",MAX_CAR);
grx_text(msg1,10,20,color,black);
sprintf(msg1,"s -> Create a new soft car (max %d)",MAX_CAR);
grx_text(msg1,10,30,color,black);
grx_text("k -> Kill oldest car",10,40,color,black);
grx_text("r -> Refresh screen",10,50,color,black);
grx_text("d -> Toggle sensor",10,60,color,black);
grx_text("road spd",CAMX,CAMY-10,gray,black);
grx_text("Simcity is presented by",450,20,black,fbg);
grx_text(" Aguzzi Marco",450,50,rgb(200,140,5),fbg);
grx_text(" &",450,60,black,fbg);
grx_text(" Ferrari Fabio",450,70,rgb(120,40,226),fbg);
drawFaces(390,15,0);
drawFaces(640,15,1);
}
 
void bold_rect(WORD x1,WORD y1,WORD x2,WORD y2,BYTE r,BYTE g,BYTE b) {
int c1,c2,c3,c4;
 
if(r>=255) r=255;
if(g>=255) g=255;
if(b>=255) b=255;
 
c1=rgb(r,g,b);
c2=rgb((r+40),(g+40),(b+40));
c3=rgb((r+80),(g+80),(b+80));
c4=rgb((r+120),(g+120),(b+120));
grx_rect(x1,y1,x2,y2,c1);
grx_rect((x1+1),(y1+1),(x2-1),(y2-1),c2);
grx_rect((x1+2),(y1+2),(x2-2),(y2-2),c3);
grx_rect((x1+3),(y1+3),(x2-3),(y2-3),c4);
grx_rect((x1+4),(y1+4),(x2-4),(y2-4),c4);
grx_rect((x1+5),(y1+5),(x2-5),(y2-5),c3);
grx_rect((x1+6),(y1+6),(x2-6),(y2-6),c2);
grx_rect((x1+7),(y1+7),(x2-7),(y2-7),c1);
}
 
void drawCar(int x,int y,int angle,char mode) {
int i,j;
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
if (macchine[i][j][returnCarIndex(angle)]!=0) {
grx_plot(x+j-15,y+i-15,macchine[i][j][returnCarIndex(angle)]*mode);
}
}
}
}
 
 
void get_images() {
 
grx_getimage(0,0,799,599,clrscr);
drawStreet(0,0);
grx_getimage(0,0,639,479,street);
grx_putimage(0,0,799,599,clrscr);
grx_getimage(0,0,31,31,clrcam);
drawSprites(15,15,GAUGE,DRAW);
grx_getimage(0,0,29,29,gauge_img);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_OFF,DRAW);
grx_getimage(0,0,29,29,arrow[1]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_SX,DRAW);
grx_getimage(0,0,29,29,arrow[2]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_DX,DRAW);
grx_getimage(0,0,29,29,arrow[0]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,GAUGE_ROTTO,DRAW);
grx_getimage(0,0,29,29,brk_gauge);
grx_putimage(0,0,30,30,clrcam);
 
}
 
void drawStreet(int x,int y) {
int i,j;
 
for (i=0;i<H;i++) {
for (j=0;j<W;j++) {
grx_plot(x+j,y+i,strada[i][j]);
}
}
}
 
void drawSprites(int x,int y,char number,char mode) {
int i,j;
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
if (sprites[i][j][(int)number]!=0) {
grx_plot(x+j-15,y+i-15,sprites[i][j][(int)number]*mode);
}
}
}
}
 
void drawFaces(int x,int y,short face) {
int i,j;
 
for (i=0;i<74;i++) {
for (j=0;j<47;j++) {
grx_plot(x+j,y+i,faces[face][i][j]);
}
}
}
 
/demos/branches/pj/edfact/initfile.c
0,0 → 1,99
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:41 $
------------
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "edfact.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDFACT_register_level(EDFACT_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
//keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/demos/branches/pj/edfact/edfact.c
0,0 → 1,735
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: edfact.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:41 $
------------
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "edfact.h"
#include <ll/stdio.h>
#include <ll/string.h>
#include <kernel/model.h>
#include <kernel/descr.h>
#include <kernel/var.h>
#include <kernel/func.h>
#include <kernel/trace.h>
 
//#define edfact_printf kern_printf
#define edfact_printf printk
 
/*+ Status used in the level +*/
#define EDFACT_READY MODULE_STATUS_BASE /*+ - Ready status +*/
#define EDFACT_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
 
/*+ flags +*/
#define EDFACT_FLAG_NORAISEEXC 2
 
/*+ the level redefinition for the Earliest Deadline First level +*/
typedef struct {
level_des l; /*+ the standard level descriptor +*/
 
TIME period[MAX_PROC]; /*+ The task periods; the deadlines are
stored in the priority field +*/
int deadline_timer[MAX_PROC];
/*+ The task deadline timers +*/
 
struct timespec deadline_timespec[MAX_PROC];
 
int dline_miss[MAX_PROC]; /*+ Deadline miss counter +*/
int wcet_miss[MAX_PROC]; /*+ Wcet miss counter +*/
 
int nact[MAX_PROC]; /*+ Wcet miss counter +*/
 
int flag[MAX_PROC];
/*+ used to manage the JOB_TASK_MODEL and the
periodicity +*/
 
QUEUE ready; /*+ the ready queue +*/
 
int flags; /*+ the init flags... +*/
 
bandwidth_t U; /*+ the used bandwidth +*/
 
} EDFACT_level_des;
 
 
static void EDFACT_timer_deadline(void *par);
 
static void EDFACT_internal_activate(EDFACT_level_des *lev, PID p)
{
TIMESPEC_ASSIGN(&proc_table[p].timespec_priority,
&proc_table[p].request_time);
ADDUSEC2TIMESPEC(lev->period[p], &proc_table[p].timespec_priority);
 
TIMESPEC_ASSIGN(&lev->deadline_timespec[p],
&proc_table[p].timespec_priority);
 
/* Insert task in the correct position */
proc_table[p].status = EDFACT_READY;
q_timespec_insert(p,&lev->ready);
 
/* needed because when there is a wcet miss I disable CONTROL_CAP */
proc_table[p].control |= CONTROL_CAP;
}
 
static char *EDFACT_status_to_a(WORD status)
{
if (status < MODULE_STATUS_BASE)
return status_to_a(status);
 
switch (status) {
case EDFACT_READY : return "EDFACT_Ready";
case EDFACT_IDLE : return "EDFACT_Idle";
default : return "EDFACT_Unknown";
}
}
 
static void EDFACT_timer_deadline(void *par)
{
PID p = (PID) par;
EDFACT_level_des *lev;
 
lev = (EDFACT_level_des *)level_table[proc_table[p].task_level];
 
switch (proc_table[p].status) {
case EDFACT_IDLE:
edfact_printf("I%d",p);
TIMESPEC_ASSIGN(&proc_table[p].request_time,
&proc_table[p].timespec_priority);
 
EDFACT_internal_activate(lev,p);
 
event_need_reschedule();
break;
 
default:
edfact_printf("D%d",p);
/* else, a deadline miss occurred!!! */
lev->dline_miss[p]++;
 
/* the task is into another state */
lev->nact[p]++;
 
/* Set the deadline timer */
ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
}
 
/* Set the deadline timer */
lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
EDFACT_timer_deadline,
(void *)p);
 
}
 
static void EDFACT_timer_guest_deadline(void *par)
{
PID p = (PID) par;
 
edfact_printf("AAARRRGGGHHH!!!");
kern_raise(XDEADLINE_MISS,p);
}
 
static int EDFACT_level_accept_task_model(LEVEL l, TASK_MODEL *m)
{
if (m->pclass == HARD_PCLASS || m->pclass == (HARD_PCLASS | l)) {
HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
 
if (h->wcet && h->mit && h->periodicity == PERIODIC)
return 0;
}
 
return -1;
}
 
static int EDFACT_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
{
if (m->pclass == JOB_PCLASS || m->pclass == (JOB_PCLASS | l))
return 0;
else
return -1;
}
 
 
static char *onoff(int i)
{
if (i)
return "On ";
else
return "Off";
}
 
static void EDFACT_level_status(LEVEL l)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
PID p = lev->ready;
 
kern_printf("On-line guarantee : %s\n",
onoff(lev->flags & EDFACT_ENABLE_GUARANTEE));
kern_printf("Used Bandwidth : %u/%u\n",
lev->U, MAX_BANDWIDTH);
 
while (p != NIL) {
if ((proc_table[p].pclass) == JOB_PCLASS)
kern_printf("Pid: %2d (GUEST)\n", p);
else
kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
p,
proc_table[p].name,
"Period ",
lev->period[p],
proc_table[p].timespec_priority.tv_sec,
proc_table[p].timespec_priority.tv_nsec/1000,
EDFACT_status_to_a(proc_table[p].status));
p = proc_table[p].next;
}
 
for (p=0; p<MAX_PROC; p++)
if (proc_table[p].task_level == l && proc_table[p].status != EDFACT_READY
&& proc_table[p].status != FREE )
kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
p,
proc_table[p].name,
"Period ",
lev->period[p],
proc_table[p].timespec_priority.tv_sec,
proc_table[p].timespec_priority.tv_nsec/1000,
EDFACT_status_to_a(proc_table[p].status));
}
 
/* The scheduler only gets the first task in the queue */
static PID EDFACT_level_scheduler(LEVEL l)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* { // print 4 dbg the ready queue
PID p= lev->ready;
kern_printf("(s");
while (p != NIL) {
kern_printf("%d ",p);
p = proc_table[p].next;
}
kern_printf(") ");
}
*/
return (PID)lev->ready;
}
 
/* The on-line guarantee is enabled only if the appropriate flag is set... */
static int EDFACT_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
if (lev->flags & EDFACT_FAILED_GUARANTEE) {
*freebandwidth = 0;
return 0;
}
else
if (*freebandwidth >= lev->U) {
*freebandwidth -= lev->U;
return 1;
}
else
return 0;
 
}
 
static int EDFACT_task_create(LEVEL l, PID p, TASK_MODEL *m)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* if the EDFACT_task_create is called, then the pclass must be a
valid pclass. */
 
HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
 
lev->period[p] = h->mit;
 
lev->flag[p] = 0;
lev->deadline_timer[p] = -1;
lev->dline_miss[p] = 0;
lev->wcet_miss[p] = 0;
lev->nact[p] = 0;
 
/* Enable wcet check */
proc_table[p].avail_time = h->wcet;
proc_table[p].wcet = h->wcet;
proc_table[p].control |= CONTROL_CAP;
 
/* update the bandwidth... */
if (lev->flags & EDFACT_ENABLE_GUARANTEE) {
bandwidth_t b;
b = (MAX_BANDWIDTH / h->mit) * h->wcet;
 
/* really update lev->U, checking an overflow... */
if (MAX_BANDWIDTH - lev->U > b)
lev->U += b;
else
/* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
in this case, we don't raise an exception... in fact, after the
EDFACT_task_create the task_create will call level_guarantee that return
-1... return -1 in EDFACT_task_create isn't correct, because:
. generally, the guarantee must be done when also the resources
are registered
. returning -1 will cause the task_create to return with an errno
ETASK_CREATE instead of ENO_GUARANTEE!!!
 
Why I use the flag??? because if the lev->U overflows, if i.e. I set
it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
*/
lev->flags |= EDFACT_FAILED_GUARANTEE;
}
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
static void EDFACT_task_detach(LEVEL l, PID p)
{
/* the EDFACT level doesn't introduce any dinamic allocated new field.
we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
bandwidth */
 
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
if (lev->flags & EDFACT_FAILED_GUARANTEE)
lev->flags &= ~EDFACT_FAILED_GUARANTEE;
else
lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
}
 
static int EDFACT_task_eligible(LEVEL l, PID p)
{
return 0; /* if the task p is chosen, it is always eligible */
}
 
static void EDFACT_task_dispatch(LEVEL l, PID p, int nostop)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* the task state is set EXE by the scheduler()
we extract the task from the ready queue
NB: we can't assume that p is the first task in the queue!!! */
q_extract(p, &lev->ready);
}
 
static void EDFACT_task_epilogue(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* check if the wcet is finished... */
if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
/* wcet finished: disable wcet event and count wcet miss */
edfact_printf("W%d",p);
proc_table[p].control &= ~CONTROL_CAP;
lev->wcet_miss[p]++;
}
 
/* the task it returns into the ready queue... */
q_timespec_insert(p,&lev->ready);
proc_table[p].status = EDFACT_READY;
}
 
static void EDFACT_task_activate(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* Test if we are trying to activate a non sleeping task */
/* save activation (only if needed... */
if (proc_table[p].status != SLEEP) {
/* a periodic task cannot be activated when it is already active */
kern_raise(XACTIVATION,p);
return;
}
 
ll_gettime(TIME_EXACT, &proc_table[p].request_time);
 
EDFACT_internal_activate(lev,p);
 
/* Set the deadline timer */
lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
EDFACT_timer_deadline,
(void *)p);
 
}
 
static void EDFACT_task_insert(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* Insert task in the coEDFect position */
proc_table[p].status = EDFACT_READY;
q_timespec_insert(p,&lev->ready);
}
 
static void EDFACT_task_extract(LEVEL l, PID p)
{
}
 
static void EDFACT_task_endcycle(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
 
/* we reset the capacity counters... */
proc_table[p].avail_time = proc_table[p].wcet;
 
if (lev->nact[p] > 0) {
edfact_printf("E%d",p);
 
/* Pending activation: reactivate the thread!!! */
lev->nact[p]--;
 
/* see also EDFACT_timer_deadline */
ll_gettime(TIME_EXACT, &proc_table[p].request_time);
 
EDFACT_internal_activate(lev,p);
 
/* check if the deadline has already expired */
if (TIMESPEC_A_LT_B(&proc_table[p].timespec_priority, &schedule_time)) {
/* count the deadline miss */
lev->dline_miss[p]++;
event_delete(lev->deadline_timer[p]);
}
 
}
else {
edfact_printf("e%d",p);
 
/* the task has terminated his job before it consume the wcet. All OK! */
proc_table[p].status = EDFACT_IDLE;
 
/* when the deadline timer fire, it recognize the situation and set
correctly all the stuffs (like reactivation, request_time, etc... ) */
}
}
 
static void EDFACT_task_end(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
edfact_printf("Û%d",p);
 
/* we finally put the task in the ready queue */
proc_table[p].status = FREE;
q_insertfirst(p,&freedesc);
/* and free the allocated bandwidth */
lev->U -= (MAX_BANDWIDTH/lev->period[p]) * proc_table[p].wcet;
 
if (lev->deadline_timer[p] != -1) {
edfact_printf("²%d",p);
event_delete(lev->deadline_timer[p]);
}
}
 
static void EDFACT_task_sleep(LEVEL l, PID p)
{ kern_raise(XUNVALID_TASK,exec_shadow); }
 
static void EDFACT_task_delay(LEVEL l, PID p, TIME usdelay)
{ kern_raise(XUNVALID_TASK,exec_shadow); }
 
/* Guest Functions
These functions manages a JOB_TASK_MODEL, that is used to put
a guest task in the EDFACT ready queue. */
 
static int EDFACT_guest_create(LEVEL l, PID p, TASK_MODEL *m)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
JOB_TASK_MODEL *job = (JOB_TASK_MODEL *)m;
 
/* if the EDFACT_guest_create is called, then the pclass must be a
valid pclass. */
 
TIMESPEC_ASSIGN(&proc_table[p].timespec_priority, &job->deadline);
lev->deadline_timer[p] = -1;
lev->dline_miss[p] = 0;
lev->wcet_miss[p] = 0;
lev->nact[p] = 0;
 
if (job->noraiseexc)
lev->flag[p] = EDFACT_FLAG_NORAISEEXC;
else
lev->flag[p] = 0;
 
lev->period[p] = job->period;
 
/* there is no bandwidth guarantee at this level, it is performed
by the level that inserts guest tasks... */
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
static void EDFACT_guest_detach(LEVEL l, PID p)
{
/* the EDFACT level doesn't introduce any dinamic allocated new field.
No guarantee is performed on guest tasks... so we don't have to reset
the NO_GUARANTEE FIELD */
}
 
static void EDFACT_guest_dispatch(LEVEL l, PID p, int nostop)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* the task state is set to EXE by the scheduler()
we extract the task from the ready queue
NB: we can't assume that p is the first task in the queue!!! */
q_extract(p, &lev->ready);
}
 
static void EDFACT_guest_epilogue(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* the task has been preempted. it returns into the ready queue... */
q_timespec_insert(p,&lev->ready);
proc_table[p].status = EDFACT_READY;
}
 
static void EDFACT_guest_activate(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* Insert task in the correct position */
q_timespec_insert(p,&lev->ready);
proc_table[p].status = EDFACT_READY;
 
/* Set the deadline timer */
if (!(lev->flag[p] & EDFACT_FLAG_NORAISEEXC))
lev->deadline_timer[p] = kern_event_post(&proc_table[p].timespec_priority,
EDFACT_timer_guest_deadline,
(void *)p);
 
}
 
static void EDFACT_guest_insert(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
/* Insert task in the correct position */
q_timespec_insert(p,&lev->ready);
proc_table[p].status = EDFACT_READY;
}
 
static void EDFACT_guest_extract(LEVEL l, PID p)
{
}
 
static void EDFACT_guest_endcycle(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void EDFACT_guest_end(LEVEL l, PID p)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
 
//kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
if (proc_table[p].status == EDFACT_READY)
{
q_extract(p, &lev->ready);
//kern_printf("(g_end rdy extr)");
}
 
/* we remove the deadline timer, because the slice is finished */
if (lev->deadline_timer[p] != NIL) {
// kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
event_delete(lev->deadline_timer[p]);
lev->deadline_timer[p] = NIL;
}
 
}
 
static void EDFACT_guest_sleep(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void EDFACT_guest_delay(LEVEL l, PID p, TIME usdelay)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
/* Registration functions */
 
/*+ Registration function:
int flags the init flags ... see EDFACT.h +*/
void EDFACT_register_level(int flags)
{
LEVEL l; /* the level that we register */
EDFACT_level_des *lev; /* for readableness only */
PID i; /* a counter */
 
printk("EDFACT_register_level\n");
 
/* request an entry in the level_table */
l = level_alloc_descriptor();
 
printk(" alloco descrittore %d %d\n",l,(int)sizeof(EDFACT_level_des));
 
/* alloc the space needed for the EDFACT_level_des */
lev = (EDFACT_level_des *)kern_alloc(sizeof(EDFACT_level_des));
 
printk(" lev=%d\n",(int)lev);
 
/* update the level_table with the new entry */
level_table[l] = (level_des *)lev;
 
/* fill the standard descriptor */
strncpy(lev->l.level_name, EDFACT_LEVELNAME, MAX_LEVELNAME);
lev->l.level_code = EDFACT_LEVEL_CODE;
lev->l.level_version = EDFACT_LEVEL_VERSION;
 
lev->l.level_accept_task_model = EDFACT_level_accept_task_model;
lev->l.level_accept_guest_model = EDFACT_level_accept_guest_model;
lev->l.level_status = EDFACT_level_status;
lev->l.level_scheduler = EDFACT_level_scheduler;
 
if (flags & EDFACT_ENABLE_GUARANTEE)
lev->l.level_guarantee = EDFACT_level_guarantee;
else
lev->l.level_guarantee = NULL;
 
lev->l.task_create = EDFACT_task_create;
lev->l.task_detach = EDFACT_task_detach;
lev->l.task_eligible = EDFACT_task_eligible;
lev->l.task_dispatch = EDFACT_task_dispatch;
lev->l.task_epilogue = EDFACT_task_epilogue;
lev->l.task_activate = EDFACT_task_activate;
lev->l.task_insert = EDFACT_task_insert;
lev->l.task_extract = EDFACT_task_extract;
lev->l.task_endcycle = EDFACT_task_endcycle;
lev->l.task_end = EDFACT_task_end;
lev->l.task_sleep = EDFACT_task_sleep;
lev->l.task_delay = EDFACT_task_delay;
 
lev->l.guest_create = EDFACT_guest_create;
lev->l.guest_detach = EDFACT_guest_detach;
lev->l.guest_dispatch = EDFACT_guest_dispatch;
lev->l.guest_epilogue = EDFACT_guest_epilogue;
lev->l.guest_activate = EDFACT_guest_activate;
lev->l.guest_insert = EDFACT_guest_insert;
lev->l.guest_extract = EDFACT_guest_extract;
lev->l.guest_endcycle = EDFACT_guest_endcycle;
lev->l.guest_end = EDFACT_guest_end;
lev->l.guest_sleep = EDFACT_guest_sleep;
lev->l.guest_delay = EDFACT_guest_delay;
 
/* fill the EDFACT descriptor part */
for(i=0; i<MAX_PROC; i++) {
lev->period[i] = 0;
lev->deadline_timer[i] = -1;
lev->flag[i] = 0;
lev->dline_miss[i] = 0;
lev->wcet_miss[i] = 0;
lev->nact[i] = 0;
}
 
lev->ready = NIL;
lev->flags = flags & 0x07;
lev->U = 0;
}
 
bandwidth_t EDFACT_usedbandwidth(LEVEL l)
{
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
return lev->U;
else
return 0;
}
 
int EDFACT_get_dline_miss(PID p)
{
LEVEL l = proc_table[p].task_level;
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
return lev->dline_miss[p];
else
return -1;
}
 
int EDFACT_get_wcet_miss(PID p)
{
LEVEL l = proc_table[p].task_level;
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
return lev->wcet_miss[p];
else
return -1;
}
 
int EDFACT_get_nact(PID p)
{
LEVEL l = proc_table[p].task_level;
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
return lev->nact[p];
else
return -1;
}
 
int EDFACT_reset_dline_miss(PID p)
{
LEVEL l = proc_table[p].task_level;
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
{
lev->dline_miss[p] = 0;
return 0;
}
else
return -1;
}
 
int EDFACT_reset_wcet_miss(PID p)
{
LEVEL l = proc_table[p].task_level;
EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
if (lev->l.level_code == EDFACT_LEVEL_CODE &&
lev->l.level_version == EDFACT_LEVEL_VERSION)
{
lev->wcet_miss[p] = 0;
return 0;
}
else
return -1;
}
 
/demos/branches/pj/edfact/testact.c
0,0 → 1,245
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: testact.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:41 $
------------
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/* the demo tests EDFACT with my Celeron 366 Mhz.
Aster1 meet all wcets and all deadlines
Aster2 miss all wcets but hits all the deadlines
Aster3 blocks on a semaphore so it miss all the deadlines and it accumulates
pending activations
Aster4 does 5 states:
1: is a cycle, long enough to cope a little more than 2 periods
2-5: like aster1, they meets all the wcet and deadlines
the debug pattern is something like
WDDEEeIeIeI
W wcet violated
D deadline miss event
E endcycle with automatic reactivation due to pending activations
e normal endcycle
I normal reactivation event
 
 
*/
 
 
#include <kernel/kern.h>
#include <semaphore.h>
#include "edfact.h"
 
PID p1,p2,p3,p4;
 
sem_t sem;
 
#define ASTER_LIM 77
 
TASK aster1(void *arg)
{
int i = 10;
int y = 10+exec_shadow;
 
printf_xy(1,y,WHITE,"%d", exec_shadow);
while (i < ASTER_LIM) {
puts_xy(i,y,WHITE,"*");
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
 
return 0;
}
 
TASK aster2(void *arg)
{
int i = 10;
int y = 10+exec_shadow;
int x;
 
printf_xy(1,y,WHITE,"%d", exec_shadow);
while (i < ASTER_LIM) {
puts_xy(i,y,WHITE,"*");
for(x=0; x<1000000; x++);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
 
return 0;
}
 
TASK aster3(void *arg)
{
int i = 10;
int y = 10+exec_shadow;
 
printf_xy(1,y,WHITE,"%d", exec_shadow);
while (i < ASTER_LIM) {
puts_xy(i,y,WHITE,"*");
sem_wait(&sem);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
 
return 0;
}
 
TASK aster4(void *arg)
{
int i = 10;
int y = 10+exec_shadow;
int x;
int flag = 0;
 
printf_xy(1,y,WHITE,"%d", exec_shadow);
while (i < ASTER_LIM) {
puts_xy(i,y,WHITE,"*");
 
switch (flag) {
case 0:
kern_printf("!");
for(x=0; x<5000000; x++) flag=1;
break;
case 1:
flag = 2;
break;
case 2:
flag = 3;
break;
case 3:
flag = 4;
break;
case 4:
flag = 0;
break;
}
 
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
 
return 0;
}
 
 
 
TASK clock()
{
printf_xy(50,19,WHITE,"PID miss wcet nact");
while(1) {
printf_xy(50,20,WHITE,"%3d %4d %4d %4d",
p1, EDFACT_get_dline_miss(p1),
EDFACT_get_wcet_miss(p1),
EDFACT_get_nact(p1));
printf_xy(50,21,WHITE,"%3d %4d %4d %4d",
p2, EDFACT_get_dline_miss(p2),
EDFACT_get_wcet_miss(p2),
EDFACT_get_nact(p2));
printf_xy(50,22,WHITE,"%3d %4d %4d %4d",
p3, EDFACT_get_dline_miss(p3),
EDFACT_get_wcet_miss(p3),
EDFACT_get_nact(p3));
printf_xy(50,23,WHITE,"%3d %4d %4d %4d",
p4, EDFACT_get_dline_miss(p4),
EDFACT_get_wcet_miss(p4),
EDFACT_get_nact(p4));
}
}
 
int main(int argc, char **argv)
{
NRT_TASK_MODEL n;
 
HARD_TASK_MODEL m;
 
kern_printf("\nCtrl-C = end demo\n");
 
hard_task_default_model(m);
hard_task_def_mit(m,200000);
hard_task_def_group(m,1);
 
sem_init(&sem,0,0);
 
hard_task_def_wcet(m,2000);
p1 = task_create("1",aster1,&m,NULL);
if (p1 == -1) {
perror("Aster.C(main): Could not create task <aster> ...");
sys_end();
}
 
hard_task_def_wcet(m,2000);
p2 = task_create("1",aster2,&m,NULL);
if (p2 == -1) {
perror("Aster.C(main): Could not create task <aster> ...");
sys_end();
}
 
hard_task_def_wcet(m,2000);
p3 = task_create("1",aster3,&m,NULL);
if (p3 == -1) {
perror("Aster.C(main): Could not create task <aster> ...");
sys_end();
}
 
hard_task_def_mit(m,20000);
hard_task_def_wcet(m,500);
p4 = task_create("1",aster4,&m,NULL);
if (p4 == -1) {
perror("Aster.C(main): Could not create task <aster> ...");
sys_end();
}
 
group_activate(1);
 
nrt_task_default_model(n);
task_activate(task_create("Clock",clock,&n,NULL));
return 0;
}
 
/demos/branches/pj/edfact/edfact.h
0,0 → 1,151
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: edfact.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:41 $
------------
 
This file contains the server EDFACT (EDF with pending activations)
 
Title:
EDFACT
 
Task Models Accepted:
HARD_TASK_MODEL - Hard Tasks (only Periodic)
wcet field and mit field must be != 0. They are used to set the wcet
and period of the tasks.
periodicity field can be only PERIODIC
drel field is ignored
Guest Models Accepted:
JOB_TASK_MODEL - a single guest task activation
Identified by an absolute deadline and a period.
period field is ignored
 
Description:
This module schedule his tasks following the classic EDF scheme.
The task guarantee is based on the factor utilization approach.
The tasks scheduled are only periodic.
All the task are put in a queue and the scheduling is based on the
deadline value.
NO GUARANTEE is performed on guest tasks. The guarantee must be performed
by the level that inserts guest tasks in the EDF level.
If a task miss a deadline a counter is incremented.
If a task exausts the wcet a counter is incremented
No ZOMBIE support!!!!!!
 
Exceptions raised:
XUNVALID_GUEST XUNVALID_TASK
some primitives are not implemented:
task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
 
XACTIVATION
If a task is actiated through task_activate or guest_activate more than
one time
Restrictions & special features:
- This level doesn't manage the main task.
- At init time we have to specify:
. guarantee check
(when all task are created the system will check that the task_set
will not use more than the available bandwidth)
- A function to return the used bandwidth of the level is provided.
- Functions to return and reset the nact, wcet and dline miss counters
 
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#ifndef __EDFACT_H__
#define __EDFACT_H__
 
#include <ll/ll.h>
#include <kernel/config.h>
#include <sys/types.h>
#include <kernel/types.h>
#include <modules/codes.h>
 
 
 
 
 
 
 
 
/*+ flags... +*/
#define EDFACT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
#define EDFACT_ENABLE_ALL 1
 
#define EDFACT_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
in EDF_register_level... +*/
 
 
 
 
 
#define ELASTIC_HARD_PCLASS 0x0600
 
#define EDFACT_LEVELNAME "EDFACT base"
#define EDFACT_LEVEL_CODE 166
#define EDFACT_LEVEL_VERSION 1
 
 
/*+ Registration function:
int flags Options to be used in this level instance...
+*/
void EDFACT_register_level(int flags);
 
/*+ Returns the used bandwidth of a level +*/
bandwidth_t EDFACT_usedbandwidth(LEVEL l);
 
/*+ returns respectively the number of dline, wcet or nact; -1 if error +*/
int EDFACT_get_dline_miss(PID p);
int EDFACT_get_wcet_miss(PID p);
int EDFACT_get_nact(PID p);
 
/*+ resets respectively the number of dline, wcet miss; -1 if error +*/
int EDFACT_reset_dline_miss(PID p);
int EDFACT_reset_wcet_miss(PID p);
 
#endif
 
/demos/branches/pj/edfact/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= testact
 
include $(BASE)/config/example.mk
 
testact:
make -f $(SUBMAKE) APP=testact INIT= OTHEROBJS="initfile.o edfact.o" OTHERINCL=
 
/demos/branches/pj/edfact/readme
0,0 → 1,31
EDFACT Scheduling Module
------------------------
by Paolo Gai 2001
 
 
Pisa, 6, Jun 2001
 
This Module implements a EDF scheduler.
 
It is very similar to the EDF Module distributed with the kernel sources,
except that:
- It does not support hard sporadic tasks
- It does not raise a deadline exception
- It does not raise a wcet violation exception
- Instead of raising an exception, the module simply COUNTS deadline misses
and wcet exaustions..
 
Since a large part of the applications use only periodic tasks, this Module
can be a great improvement because the application will not hang up at
the first exception!!! (and this happens frequently when switching to a
slower PC :-( )
 
I also wrote a simple test to show how the module works...
 
To use the Module in your applications, simply copy the edfact.c and edfact.h
into your application directory, and register edfact instead of the
tradictional edf...
 
For bugs, questions and comments please write to pj@sssup.it
 
Paolo
/demos/branches/pj/myapp/initfile.c
0,0 → 1,66
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "mymod.h"
#include "modules/dummy.h"
 
/*+ sysyem tick in us +*/
#define TICK 300
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
MYMOD_register_level(120);
dummy_register_level();
 
// periodic timer
return TICK;
// one-shot timer
// return 0
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
__call_main__(mb);
 
return (void *)0;
}
 
 
 
/demos/branches/pj/myapp/mymod.c
0,0 → 1,270
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include "mymod.h"
#include <ll/string.h>
#include <kernel/model.h>
#include <kernel/descr.h>
#include <kernel/var.h>
#include <kernel/func.h>
 
// other include files if needed
 
// NOTE: NO GLOBAL OR STATIC VARIABLES!!!
// (put them inside the level descriptor!)
 
/* Statuses used in the level */
#define MYMOD_READY MODULE_STATUS_BASE
#define MYMOD_WAIT MODULE_STATUS_BASE+3
#define MYMOD_IDLE MODULE_STATUS_BASE+4
 
/* the level redefinition for the Module */
typedef struct {
level_des l; /* the standard level descriptor */
 
int myvar[100]; /* other local (private) variables of the module */
 
} MYMOD_level_des;
 
// example of OSLib event
static void MYMOD_timer_deadline(void *par)
{
// usually the void *par is a pointer to a structure or a PID
// if it is a PID, you can do that to retrieve it and the correspondent
// level descriptor
PID p = (PID) par;
MYMOD_level_des *lev;
 
lev = (MYMOD_level_des *)level_table[proc_table[p].task_level];
 
// now you know the PID of the task and the level descriptor
// ... so, you know all the things you need
}
 
static int MYMOD_level_accept_task_model(LEVEL l, TASK_MODEL *m)
{
// your code here
return 0; // dummy number
}
 
static int MYMOD_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
{
// your code here
return 0; // dummy number
}
 
static void MYMOD_level_status(LEVEL l)
{
}
 
/* The scheduler only gets the first task in the queue */
static PID MYMOD_level_scheduler(LEVEL l)
{
return 0; // dummy number
}
 
/* The on-line guarantee is enabled only if the appropriate flag is set... */
static int MYMOD_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
{
return 0; // dummy number
}
 
static int MYMOD_task_create(LEVEL l, PID p, TASK_MODEL *m)
{
return 0; // dummy number
}
 
static void MYMOD_task_detach(LEVEL l, PID p)
{
}
 
static int MYMOD_task_eligible(LEVEL l, PID p)
{
return 0; // dummy number
}
 
static void MYMOD_task_dispatch(LEVEL l, PID p, int nostop)
{
}
 
static void MYMOD_task_epilogue(LEVEL l, PID p)
{
}
 
static void MYMOD_task_activate(LEVEL l, PID p)
{
}
 
static void MYMOD_task_insert(LEVEL l, PID p)
{
}
 
static void MYMOD_task_extract(LEVEL l, PID p)
{
}
 
static void MYMOD_task_endcycle(LEVEL l, PID p)
{
}
 
static void MYMOD_task_end(LEVEL l, PID p)
{
}
 
static void MYMOD_task_sleep(LEVEL l, PID p)
{
}
 
static void MYMOD_task_delay(LEVEL l, PID p, TIME usdelay)
{
}
 
static int MYMOD_guest_create(LEVEL l, PID p, TASK_MODEL *m)
{
return 0; // dummy number
}
 
static void MYMOD_guest_detach(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_dispatch(LEVEL l, PID p, int nostop)
{
}
 
static void MYMOD_guest_epilogue(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_activate(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_insert(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_extract(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_endcycle(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_end(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_sleep(LEVEL l, PID p)
{
}
 
static void MYMOD_guest_delay(LEVEL l, PID p, TIME usdelay)
{
}
 
 
 
 
/* Registration functions */
 
/*+ Registration function:
int flags the init flags ... see MYMOD.h +*/
void MYMOD_register_level(int flags)
{
LEVEL l; /* the level that we register */
MYMOD_level_des *lev; /* for readableness only */
PID i; /* a counter */
 
/* request an entry in the level_table */
l = level_alloc_descriptor();
 
/* alloc the space needed for the MYMOD_level_des */
lev = (MYMOD_level_des *)kern_alloc(sizeof(MYMOD_level_des));
 
/* update the level_table with the new entry */
level_table[l] = (level_des *)lev;
 
/* fill the standard descriptor */
strncpy(lev->l.level_name, MYMOD_LEVELNAME, MAX_LEVELNAME);
lev->l.level_code = MYMOD_LEVEL_CODE;
lev->l.level_version = MYMOD_LEVEL_VERSION;
 
lev->l.level_accept_task_model = MYMOD_level_accept_task_model;
lev->l.level_accept_guest_model = MYMOD_level_accept_guest_model;
lev->l.level_status = MYMOD_level_status;
lev->l.level_scheduler = MYMOD_level_scheduler;
lev->l.level_guarantee = MYMOD_level_guarantee;
 
lev->l.task_create = MYMOD_task_create;
lev->l.task_detach = MYMOD_task_detach;
lev->l.task_eligible = MYMOD_task_eligible;
lev->l.task_dispatch = MYMOD_task_dispatch;
lev->l.task_epilogue = MYMOD_task_epilogue;
lev->l.task_activate = MYMOD_task_activate;
lev->l.task_insert = MYMOD_task_insert;
lev->l.task_extract = MYMOD_task_extract;
lev->l.task_endcycle = MYMOD_task_endcycle;
lev->l.task_end = MYMOD_task_end;
lev->l.task_sleep = MYMOD_task_sleep;
lev->l.task_delay = MYMOD_task_delay;
 
lev->l.guest_create = MYMOD_guest_create;
lev->l.guest_detach = MYMOD_guest_detach;
lev->l.guest_dispatch = MYMOD_guest_dispatch;
lev->l.guest_epilogue = MYMOD_guest_epilogue;
lev->l.guest_activate = MYMOD_guest_activate;
lev->l.guest_insert = MYMOD_guest_insert;
lev->l.guest_extract = MYMOD_guest_extract;
lev->l.guest_endcycle = MYMOD_guest_endcycle;
lev->l.guest_end = MYMOD_guest_end;
lev->l.guest_sleep = MYMOD_guest_sleep;
lev->l.guest_delay = MYMOD_guest_delay;
 
/* fill the MYMOD descriptor part */
for (i=0; i<100; i++)
lev->myvar[i] = 0;
}
 
// put here the other interface functions added
 
 
 
 
 
 
 
/demos/branches/pj/myapp/myapp.c
0,0 → 1,55
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
// if you want to use some functions, types, task models provided
// by your new module
 
#include "mymod.h"
 
// then, include any file you want here
 
// then, the classic C-style function
int main(int argc, char **argv)
{
// ... your stuff here
return 0;
}
 
 
 
 
 
 
 
 
/demos/branches/pj/myapp/readme.txt
0,0 → 1,7
This is a template application, and it DOES NOTHING!!!
 
This is only an example package.
 
Please refer to the How To Compile reference guide for more informations.
 
Paolo
/demos/branches/pj/myapp/mymod.h
0,0 → 1,113
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/* put here a description of the module */
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
 
#ifndef __MYMOD_H__
#define __MYMOD_H__
 
#include <kernel/model.h>
// maybe you need here some include file
 
// then... we define a new Task Model without modifying
// the standard kernel distribution
 
// pick a pclass number not used into include/kernel/model.h
#define MY_PCLASS 0x0700
 
/*
maybe a description of the new fields of the Model is useful here
*/
 
typedef struct {
TASK_MODEL t;
int myparameter;
} MY_TASK_MODEL;
 
#define my_task_default_model(m) \
task_default_model((m).t,MY_PCLASS), \
(m).myparameter = 0
#define my_task_def_level(m,l) task_def_level((m).t,l)
#define my_task_def_arg(m,a) task_def_arg((m).t,a)
#define my_task_def_stack(m,s) task_def_stack((m).t,s)
#define my_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
#define my_task_def_group(m,g) task_def_group((m).t,g)
#define my_task_def_usemath(m) task_def_usemath((m).t)
#define my_task_def_system(m) task_def_system((m).t)
#define my_task_def_nokill(m) task_def_nokill((m).t)
#define my_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
#define my_task_def_myparameter(m,p) (m).myparameter = (p)
#define my_task_def_joinable(m) task_def_joinable((m).t)
#define my_task_def_unjoinable(m) task_def_unjoinable((m).t)
#define my_task_def_trace(m) task_def_trace((m).t)
#define my_task_def_notrace(m) task_def_notrace((m).t)
 
// pick a code and a version not used into the file include/modules/codes.h
#define MYMOD_LEVELNAME "My new scheduling module"
#define MYMOD_LEVEL_CODE 999
#define MYMOD_LEVEL_VERSION 1
 
// if the module raises some new exception list them here
// pincking up unused numbers from include/bits/errno.h
 
/*+ Registration function:
int parameter Options to be used in this level instance... +*/
void MYMOD_register_level(int parameter);
 
/* here you can also put some other functions similar for example
to the EDF_usedbandwidth() in the file include/modules/edf.h */
 
#endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/demos/branches/pj/myapp/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=..
endif
include $(BASE)/config/config.mk
 
PROGS= myapp
 
include $(BASE)/config/example.mk
 
myapp:
make -f $(SUBMAKE) APP=myapp INIT= OTHEROBJS="initfile.o mymod.o"
 
/demos/branches/pj/static/initfile.c
0,0 → 1,81
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:48 $
------------
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "static.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
STATIC_register_level();
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
__call_main__(mb);
 
return (void *)0;
}
 
/demos/branches/pj/static/static.c
0,0 → 1,362
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: static.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:48 $
------------
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "static.h"
#include <ll/stdio.h>
#include <ll/string.h>
#include <kernel/model.h>
#include <kernel/descr.h>
#include <kernel/var.h>
#include <kernel/func.h>
#include <kernel/trace.h>
 
#define STATIC_printf kern_printf
//#define STATIC_printf printk
 
/*+ Status used in the level +*/
#define STATIC_READY MODULE_STATUS_BASE /*+ - Ready status +*/
#define STATIC_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
 
/*+ flags +*/
#define STATIC_FLAG_NORAISEEXC 2
 
/*+ the level redefinition for the Earliest Deadline First level +*/
typedef struct {
level_des l; /*+ the standard level descriptor +*/
 
QUEUE mytable;
 
PID currenttask;
 
struct timespec hp;
struct timespec ref;
 
} STATIC_level_des;
 
static void STATIC_offset_activate(void *par)
{
PID p = (PID) par;
STATIC_level_des *lev;
 
lev = (STATIC_level_des *)level_table[proc_table[p].task_level];
 
lev->currenttask = p;
event_need_reschedule();
 
STATIC_printf("(o p%d t%d)", p, (int)proc_table[p].timespec_priority.tv_sec);
}
 
static void STATIC_activateall(STATIC_level_des *lev)
{
PID my_table_index;
struct timespec x;
 
STATIC_printf("(A ");
 
for (my_table_index = (PID)lev->mytable;
my_table_index != NIL;
my_table_index = proc_table[my_table_index].next) {
ADDTIMESPEC(&lev->ref,&proc_table[my_table_index].timespec_priority,&x);
kern_event_post(&x, STATIC_offset_activate,(void *)my_table_index);
 
STATIC_printf("|p%d t%d ",
my_table_index,
(int)proc_table[my_table_index].timespec_priority.tv_sec);
}
 
STATIC_printf(")");
 
}
 
static void STATIC_hyperperiod(void *par)
{
STATIC_level_des *lev;
struct timespec x;
 
lev = (STATIC_level_des *)level_table[(LEVEL)par];
 
STATIC_printf("(hp %d)", (int)lev->ref.tv_sec);
 
STATIC_activateall(lev);
 
ADDTIMESPEC(&lev->ref, &lev->hp, &x);
lev->ref = x;
 
kern_event_post(&x, STATIC_hyperperiod, par);
}
 
 
static int STATIC_level_accept_task_model(LEVEL l, TASK_MODEL *m)
{
if (m->pclass == STATIC_PCLASS || m->pclass == (STATIC_PCLASS | l))
return 0;
 
return -1;
}
 
static int STATIC_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
{
return -1;
}
 
 
 
static void STATIC_level_status(LEVEL l)
{ kern_raise(XUNVALID_TASK,exec_shadow); }
 
/* The scheduler only gets the first task in the queue */
static PID STATIC_level_scheduler(LEVEL l)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
return lev->currenttask;
}
 
/* The on-line guarantee is enabled only if the appropriate flag is set... */
static int STATIC_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
{
return 1;
}
 
static int STATIC_task_create(LEVEL l, PID p, TASK_MODEL *m)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
/* if the STATIC_task_create is called, then the pclass must be a
valid pclass. */
 
STATIC_TASK_MODEL *h = (STATIC_TASK_MODEL *)m;
 
proc_table[p].timespec_priority.tv_sec = h->offset.tv_sec;
proc_table[p].timespec_priority.tv_nsec = h->offset.tv_nsec;
q_timespec_insert(p,&lev->mytable);
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
static void STATIC_task_detach(LEVEL l, PID p)
{
}
 
static int STATIC_task_eligible(LEVEL l, PID p)
{
return 0; /* if the task p is chosen, it is always eligible */
}
 
static void STATIC_task_dispatch(LEVEL l, PID p, int nostop)
{
}
 
static void STATIC_task_epilogue(LEVEL l, PID p)
{
}
 
static void STATIC_task_activate(LEVEL l, PID p)
{
}
 
static void STATIC_task_insert(LEVEL l, PID p)
{
}
 
static void STATIC_task_extract(LEVEL l, PID p)
{
}
 
static void STATIC_task_endcycle(LEVEL l, PID p)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
lev->currenttask = NIL;
}
 
static void STATIC_task_end(LEVEL l, PID p)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
lev->currenttask = NIL;
 
q_extract(p,&lev->mytable);
 
/* we finally put the task in the ready queue */
proc_table[p].status = FREE;
q_insertfirst(p,&freedesc);
}
 
static void STATIC_task_sleep(LEVEL l, PID p)
{ kern_raise(XUNVALID_TASK,exec_shadow); }
 
static void STATIC_task_delay(LEVEL l, PID p, TIME usdelay)
{ kern_raise(XUNVALID_TASK,exec_shadow); }
 
/* Guest Functions
These functions manages a JOB_TASK_MODEL, that is used to put
a guest task in the STATIC ready queue. */
 
static int STATIC_guest_create(LEVEL l, PID p, TASK_MODEL *m)
{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
 
static void STATIC_guest_detach(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_dispatch(LEVEL l, PID p, int nostop)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_epilogue(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_activate(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_insert(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_extract(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_endcycle(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_end(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_sleep(LEVEL l, PID p)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
static void STATIC_guest_delay(LEVEL l, PID p, TIME usdelay)
{ kern_raise(XUNVALID_GUEST,exec_shadow); }
 
/* Registration functions */
 
/*+ Registration function:
int flags the init flags ... see STATIC.h +*/
void STATIC_register_level()
{
LEVEL l; /* the level that we register */
STATIC_level_des *lev; /* for readableness only */
 
printk("STATIC_register_level\n");
 
/* request an entry in the level_table */
l = level_alloc_descriptor();
 
printk(" alloco descrittore %d %d\n",l,(int)sizeof(STATIC_level_des));
 
/* alloc the space needed for the STATIC_level_des */
lev = (STATIC_level_des *)kern_alloc(sizeof(STATIC_level_des));
 
printk(" lev=%d\n",(int)lev);
 
/* update the level_table with the new entry */
level_table[l] = (level_des *)lev;
 
/* fill the standard descriptor */
strncpy(lev->l.level_name, STATIC_LEVELNAME, MAX_LEVELNAME);
lev->l.level_code = STATIC_LEVEL_CODE;
lev->l.level_version = STATIC_LEVEL_VERSION;
 
lev->l.level_accept_task_model = STATIC_level_accept_task_model;
lev->l.level_accept_guest_model = STATIC_level_accept_guest_model;
lev->l.level_status = STATIC_level_status;
lev->l.level_scheduler = STATIC_level_scheduler;
 
lev->l.level_guarantee = NULL;
 
lev->l.task_create = STATIC_task_create;
lev->l.task_detach = STATIC_task_detach;
lev->l.task_eligible = STATIC_task_eligible;
lev->l.task_dispatch = STATIC_task_dispatch;
lev->l.task_epilogue = STATIC_task_epilogue;
lev->l.task_activate = STATIC_task_activate;
lev->l.task_insert = STATIC_task_insert;
lev->l.task_extract = STATIC_task_extract;
lev->l.task_endcycle = STATIC_task_endcycle;
lev->l.task_end = STATIC_task_end;
lev->l.task_sleep = STATIC_task_sleep;
lev->l.task_delay = STATIC_task_delay;
 
lev->l.guest_create = STATIC_guest_create;
lev->l.guest_detach = STATIC_guest_detach;
lev->l.guest_dispatch = STATIC_guest_dispatch;
lev->l.guest_epilogue = STATIC_guest_epilogue;
lev->l.guest_activate = STATIC_guest_activate;
lev->l.guest_insert = STATIC_guest_insert;
lev->l.guest_extract = STATIC_guest_extract;
lev->l.guest_endcycle = STATIC_guest_endcycle;
lev->l.guest_end = STATIC_guest_end;
lev->l.guest_sleep = STATIC_guest_sleep;
lev->l.guest_delay = STATIC_guest_delay;
 
/* fill the STATIC descriptor part */
 
lev->mytable = NIL;
lev->currenttask = NIL;
 
NULL_TIMESPEC(&lev->hp);
NULL_TIMESPEC(&lev->ref);
}
 
void STATIC_start(LEVEL l, struct timespec *h, struct timespec *o)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
struct timespec x;
 
kern_cli();
ll_gettime(TIME_EXACT, &x);
lev->hp = *h;
 
ADDTIMESPEC(&x,o,&lev->ref);
STATIC_printf("(ST: ref:%d.%d x:%d.%d)\n",
(int)lev->ref.tv_sec, (int)lev->ref.tv_nsec,
(int)x.tv_sec, (int)x.tv_nsec);
 
kern_event_post(&x, STATIC_hyperperiod,(void *)l);
 
kern_sti();
}
 
 
/demos/branches/pj/static/test1st.c
0,0 → 1,129
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: test1st.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:48 $
------------
 
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "static.h"
#include <math.h>
#include <string.h>
 
int theend = 0;
 
void *mytask(void *arg)
{
struct timespec t;
 
for (;;)
{
sys_gettime(&t);
 
cprintf("I am task %s at time %d.%d\n", (char *)arg, (int)t.tv_sec, (int)t.tv_nsec);
 
theend++;
 
if (theend > 10) sys_end();
 
task_endcycle();
}
 
}
 
 
int main(int argc, char **argv)
{
PID p1;
 
STATIC_TASK_MODEL m;
 
struct timespec my_time, h, o, fineprg;
 
my_time.tv_nsec=0;
 
 
my_time.tv_sec = 0;
my_time.tv_nsec = 500000000;
static_task_default_model(m, my_time);
static_task_def_arg(m, "A");
 
p1 = task_create("TaskA",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <A> ...");
sys_end();
}
 
my_time.tv_sec = 1;
my_time.tv_nsec = 0;
static_task_default_model(m, my_time);
static_task_def_arg(m, "B");
 
p1 = task_create("TaskB",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <B> ...");
sys_end();
}
 
my_time.tv_sec = 1;
my_time.tv_nsec = 500000000;
static_task_default_model(m, my_time);
static_task_def_arg(m, "C");
 
p1 = task_create("TaskC",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <C> ...");
sys_end();
}
 
h.tv_sec = 3;
h.tv_nsec = 0;
 
o.tv_sec = 1;
o.tv_nsec = 0;
 
STATIC_start(0, &h, &o);
 
return 0;
}
 
/demos/branches/pj/static/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= test1st
 
include $(BASE)/config/example.mk
 
test1st:
make -f $(SUBMAKE) APP=test1st INIT= OTHEROBJS="initfile.o static.o" OTHERINCL=
 
/demos/branches/pj/static/static.h
0,0 → 1,122
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: static.h,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2002-09-02 09:37:48 $
------------
 
Static scheduler demo (FIRST Project Hand-off)
 
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#ifndef __STATIC_H__
#define __STATIC_H__
 
#include <ll/ll.h>
#include <kernel/config.h>
#include <sys/types.h>
#include <kernel/types.h>
#include <modules/codes.h>
 
 
 
 
 
 
 
 
/*+ flags... +*/
 
/* no flags for the static scheduler */
 
 
 
 
#define STATIC_PCLASS 0x1000
 
#define STATIC_LEVELNAME "STATIC 1st Project"
#define STATIC_LEVEL_CODE 167
#define STATIC_LEVEL_VERSION 1
 
 
/* -----------------------------------------------------------------------
ELASTIC_HARD_TASK_MODEL: elastic hard Tasks
----------------------------------------------------------------------- */
 
typedef struct {
TASK_MODEL t;
struct timespec offset;
} STATIC_TASK_MODEL;
 
#define static_task_default_model(m,o) \
task_default_model((m).t,STATIC_PCLASS), \
((m).offset).tv_sec = (o).tv_sec, \
((m).offset).tv_nsec = (o).tv_nsec
#define static_task_def_level(m,l) task_def_level((m).t,l)
#define static_task_def_arg(m,a) task_def_arg((m).t,a)
#define static_task_def_stack(m,s) task_def_stack((m).t,s)
#define static_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
#define static_task_def_group(m,g) task_def_group((m).t,g)
#define static_task_def_usemath(m) task_def_usemath((m).t)
#define static_task_def_system(m) task_def_system((m).t)
#define static_task_def_nokill(m) task_def_nokill((m).t)
#define static_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
#define static_task_def_joinable(m) task_def_joinable((m).t)
#define static_task_def_unjoinable(m) task_def_unjoinable((m).t)
 
 
 
 
 
/*+ Registration function:
int flags Options to be used in this level instance...
+*/
void STATIC_register_level(void);
 
void STATIC_start(LEVEL l, struct timespec *h, struct timespec *o);
 
#endif
 
/demos/branches/pj/static/readme
0,0 → 1,16
STATIC Scheduling Module
------------------------
 
This is the scheduling module created on the FIRST Project Meeting in
Vasteras, July 2002.
 
The module accept a new Task Model called STATIC_TASK_MODEL that
contains the information about the starting time of a task. After
creating all the tasks, the static scheduling starts calling the
function static_start.
 
For comments, bugfixes & co, write to pj@sssup.it.
 
Bye
 
PJ
/demos/branches/pj/lights/simlight.c
0,0 → 1,482
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* U N I V E R S I T A D I P A V I A */
/* DIPARTIMENTO DI INFORMATICA e SISTEMSTICA */
/* corso di INFORMATICA INDUSTRIALE */
/* prof. G. Buttazzo */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* S I M L I G H T */
/* progetto con S.H.A.R.K. : */
/* SIMULAZIONE FARI DA PALCO / DISCOTECA */
/* (C) 2001 by G. Vadruccio */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
/*
* Copyright (C) 2001 G. Vadruccio
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
#include <modules/cabs.h>
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
#include <drivers/keyb.h>
#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <ports/rfftw.h>
#include <math.h>
#include "blaster.h"
 
#define FFT_SCALE (16384.0) // fatt. scala usato dal task fft
 
typedef short SAMPLE; // campioni letti da SB a 16-bit
 
typedef struct { // per il CAB cab_camdata
int start;
SAMPLE sample[1000];
} campione;
 
typedef struct { // per il CAB cab_prwdata
fftw_real p[501];
} power;
 
typedef struct { // per il CAB cab_lightdata
int l[8];
} lights;
 
CAB cab_camdata; // CAB dati campionati dalla SB
CAB cab_pwrdata; // CAB dati spettro di potenza
CAB cab_lghdata; // CAB dati intensit… luci
sem_t mutex; // semaforo di mutua esclusione
campione cam; // struttura dei campioni
rfftw_plan plan; // usato dalla libreria fft
char fbuf[1000];
int flen,
WCET_FFT, WCET_LIV, WCET_LIGHT,
PERIOD_FFT, PERIOD_LIV, PERIOD_LIGHT,
AGCOP, MICLEV,
ATT1, ATT2, ATT3, ATT4, ATT5, ATT6, ATT7; // parametri letti da file ext.
 
 
void read_file(void) // funzione di lettura file di
{ // testo 'PARAM.DAT' contenente
int err; // i parametri di funzionamento
DOS_FILE *fp;
fp = DOS_fopen("param.dat","r");
if (!fp) {
err = DOS_error();
cprintf("Error %d opening param.dat...\n", err);
flen = 0;
return;
}
flen = DOS_fread(&fbuf, 1, 325, fp);
cprintf("Read %d bytes from orbit.dat\n", flen);
DOS_fclose(fp);
}
 
 
void get_par(void) // scansione dei parametri
{
int x = 0;
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_FFT); // lettura wcet task fft
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_FFT); // lettura periodo task fft
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_LIV); // lettura wcet task livelli
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_LIV); // lettura periodo task livelli
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_LIGHT); // lettura wcet task light
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_LIGHT); // lettura periodo task light
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &AGCOP); // lettura opzione AGC
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &MICLEV); // letura livello microfonico
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT1); // lettura attenuazione faro 1
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT2); // lettura attenuazione faro 2
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT3); // lettura attenuazione faro 3
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT4); // lettura attenuazione faro 4
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT5); // lettura attenuazione faro 5
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT6); // lettura attenuazione faro 6
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT7); // lettura attenuazione faro 7
}
 
 
void set_new_palette(void) // funzione di preparazione della
{ // palette di colori usata
int k, j;
 
for (k=0; k<7; k++)
for (j=(k*36); j<=(k*36)+4; j++) grx_setcolor(j,0,0,0); // nero
for (k=252; k<256; k++) grx_setcolor(k,0,0,0); // nero
for (k=1; k<=31; k++) {
grx_setcolor(k+4,(k*2)+1,0,0); // sfumatura rosso FARO 1
grx_setcolor(k+40,(k*2)+1,(k*2)+1,0); // sfumatura giallo FARO 2
grx_setcolor(k+76,0,(k*2)+1,0); // sfumatura verde FARO 3
grx_setcolor(k+112,0,(k*2)+1,(k*2)+1); // sfumarura azzurra FARO 4
grx_setcolor(k+148,0,0,(k*2)+1); // sfumatura blu FARO 5
grx_setcolor(k+184,(k*2)+1,0,(k*2)+1); // sfumatura magenta FARO 6
grx_setcolor(k+220,(k*2)+1,(k*2)+1,(k*2)+1); // sfumatura bianco FARO 7
}
}
 
 
void crea_scenario(void) // funzione di creazione scenario
{ // (trave e campane del palco)
int j;
int cs=238;
 
for (j=0; j<16; j++) grx_line(40*j,12,(40*j)+20,0,cs);
for (j=0; j<16; j++) grx_line(40*j+20,0,(40*j)+40,12,cs);
grx_rect(0,0,639,12,cs);
for (j=0; j<7; j++) {
grx_line(49+(j*83),12,49+(j*83),35,cs);
grx_line(49+(j*83),35,55+(j*83),35,cs);
grx_box(52+(j*83),32,88+(j*83),59,cs);
grx_disc(70+(j*83),33,18,cs);
grx_line(84+(j*83),35,91+(j*83),35,cs);
grx_line(91+(j*83),35,91+(j*83),12,cs);
}
}
 
 
int raw_infun(void *b) // funzione di self-buffering per
{ // la lettura dei campioni da SB
int i; // e scrittura nel cab
char *w; // dei campioni
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<500; i++) {
cam.sample[cam.start] = audiobuf[i];
cam.start = (cam.start+1) % 1000;
}
w = cab_reserve(cab_camdata);
memcpy(w, &cam, sizeof(campione));
cab_putmes(cab_camdata,w);
return 0;
}
 
 
void init_rawdata() // funzione per inizializzare
{ // il CAB dei campioni letti da SB
int i;
char *w;
 
cam.start = 0;
for (i=0; i<1000; i++)
cam.sample[i] = 0;
w = cab_reserve(cab_camdata);
memcpy(w, &cam, sizeof(campione));
cab_putmes(cab_camdata,w);
}
 
 
void fft_close(void *arg) // fun. in uscita da task fft_task
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task() // task per calcolo della fft:
{ // legge dal CAB dei dati
fftw_real in[1000], out[1000]; // campionati e scrive nal CAB
power power_spectrum; // dello spettro di potenza
campione *p;
char *m;
int k, i;
 
plan = rfftw_create_plan(1000, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
while(1)
{
p = (campione *)cab_getmes(cab_camdata);// lettura CAB dati campionati
for (k = 0, i = p->start;
k < 1000;
k++, i = (i+1)%1000)
in[k] = p->sample[i]/FFT_SCALE;
cab_unget(cab_camdata,(char *)p);
rfftw_one(plan, in, out);
power_spectrum.p[0] = out[0]*out[0]; // calcolo spettro potenza
for (k = 1; k < 501; ++k)
power_spectrum.p[k] = out[k]*out[k] + out[1000-k]*out[1000-k];
power_spectrum.p[500] = out[500]*out[500]; // Nyquist freq.
m = cab_reserve(cab_pwrdata); // scrittura nel CAB dello spettro
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
task_endcycle();
}
}
 
 
TASK livello() // task per il calcolo dei livelli
{ // luminosi dei fari: legge dal
power *p; // CAB dello spettro di potenza
lights *l; // e dal CAB dei livelli luminosi
lights w; // e aggiorna il CAB dei livelli
char *m; // luminosi
int j[8]={0,0,0,0,0,0,0,0};
int k[8]={0,0,0,0,0,0,0,0};
int y[501];
int i;
long add;
while(1) {
p = (power *)cab_getmes(cab_pwrdata); // lettura del CAB dello spettro
l = (lights *)cab_getmes(cab_lghdata);// lettura CAB livelli luminosi
for (i=1; i<=7; i++) j[i]=l->l[i];
cab_unget(cab_lghdata,(char *)l);
for (i = 1; i < 501; i++) {
if ((int)(p->p[i])>650000) y[i]=650000; //controllo range distorsione
else y[i]=(int)(p->p[i]);
}
cab_unget(cab_pwrdata,(char *)p);
/***************** calocolo livello FARO 1 **************/
add=0;
for (i=1; i<4; i++) add+=(long)(y[i]);
k[1]=(int)(add/ATT1);
if (k[1]>31) k[1]=31;
if (k[1]<0) k[1]=0;
if ((k[1]-j[1])<13) w.l[1]=j[1]-(int)((j[1]/8)+1);
else w.l[1]=k[1];
if (w.l[1]>31) w.l[1]=31;
if (w.l[1]<0) w.l[1]=0;
/***************** calocolo livello FARO 2 **************/
add=0;
for (i=6; i<20; i++) add+=(long)(y[i]/1);
for (i=90; i<100; i++) add+=(long)(y[i]*3);
k[2]=(int)(add/ATT2);
if (k[2]<13) k[2]=0;
if (k[2]>31) k[2]=31;
if ((k[2]-j[2])<5) w.l[2]=j[2]-(int)((j[2]/10)+1);
else w.l[2]=k[2];
if (w.l[2]>31) w.l[2]=31;
if (w.l[2]<0) w.l[2]=0;
/***************** calocolo livello FARO 3 **************/
add=0;
for (i=13; i<40; i++) add+=(long)(y[i]);
k[3]=(int)(add/ATT3);
if (k[3]<13) k[3]=0;
if (k[3]>31) k[3]=31;
if ((k[3]-j[3])<8) w.l[3]=j[3]-3;
else w.l[3]=k[3];
if (w.l[3]>31) w.l[3]=31;
if (w.l[3]<0) w.l[3]=0;
/***************** calocolo livello FARO 4 **************/
add=0;
for (i=40; i<60; i++) add+=(long)(y[i]);
k[4]=(int)(add/ATT4);
if (k[4]<11) k[4]=0;
if (k[4]>31) k[4]=31;
if ((k[4]-j[4])<4) w.l[4]=j[4]-3;
else w.l[4]=j[4]+3;
if (w.l[4]>31) w.l[4]=31;
if (w.l[4]<0) w.l[4]=0;
/***************** calocolo livello FARO 5 **************/
add=0;
for (i=90; i<120; i++) add+=(long)(y[i]);
for (i=15; i<30; i++) add+=(long)(y[i]/6);
k[5]=(int)(add/ATT5);
if (k[5]<13) k[5]=0;
if (k[5]>31) k[5]=31;
if ((k[5]-j[5])<4) w.l[5]=j[5]-3;
else w.l[5]=k[5];
if (w.l[5]>31) w.l[5]=31;
if (w.l[5]<0) w.l[5]=0;
/***************** calocolo livello FARO 6 **************/
add=0;
for (i=170; i<230; i++) add+=(long)(y[i]);
k[6]=(int)(add/ATT6);
if (k[6]<13) k[6]=0;
if (k[6]>31) k[6]=31;
if ((k[6]-j[6])<6) w.l[6]=j[6]-(int)((j[6]/9)+1);
else w.l[6]=j[6]+((k[6]-j[6])/3);
if (w.l[6]>31) w.l[6]=31;
if (w.l[6]<0) w.l[6]=0;
/***************** calocolo livello FARO 7 **************/
add=0;
for (i=200; i<450; i++) add+=(long)(y[i]);
k[7]=(int)(add/ATT7);
if (k[7]<13) k[7]=0;
if (k[7]<13) k[7]=0;
if (k[7]>31) k[7]=31;
if ((k[7]-j[7])<5) w.l[7]=k[7]-(int)((j[7]/10)+1);
else w.l[7]=(int)((k[7]+j[7])/2);
if (w.l[7]>31) w.l[7]=31;
if (w.l[7]<0) w.l[7]=0;
 
m=cab_reserve(cab_lghdata); // scrittura CAB livelli luminosi
memcpy(m, &w, sizeof(lights));
cab_putmes(cab_lghdata,m);
task_endcycle();
}
}
 
 
TASK light(void *arg) // task per l'accensione grafica
{ // delle luci: legge dal CAB dei
lights *p; // livelli luminosi
int i = (int)arg; // i = n. del task
int a, c, pos, liv;
 
while(1) {
p = (lights *)cab_getmes(cab_lghdata);// lettura CAB livelli luminosi
liv=p->l[i]; // livello del faro selezionato
sem_wait(&mutex); // inizio sezione critica
c=((36*i)-32)+liv; // colore del faro selezionato
pos=(83*i)-13; // posizione del faro seleionato
grx_box(pos-14,60,pos+14,440,c); // disegna il raggio lumonoso
for (a=15; a<=18; a++) grx_line(pos-15,60,pos-a,440,c);
grx_line(pos-15,60,pos-19,440,c-1);
for (a=20; a<=22; a++) grx_line(pos-16,60,pos-a,440,c-1);
grx_line(pos-16,60,pos-23,440,c-2);
for (a=24; a<=26; a++) grx_line(pos-17,60,pos-a,440,c-2);
for (a=27; a<=30; a++) grx_line(pos-17,60,pos-a,440,c-3);
for (a=31; a<=34; a++) grx_line(pos-17,60,pos-a,440,c-3);
for (a=15; a<=18; a++) grx_line(pos+15,60,pos+a,440,c);
grx_line(pos+15,60,pos+19,440,c-1);
for (a=20; a<=22; a++) grx_line(pos+16,60,pos+a,440,c-1);
grx_line(pos+16,60,pos+23,440,c-2);
for (a=24; a<=26; a++) grx_line(pos+17,60,pos+a,440,c-2);
for (a=27; a<=30; a++) grx_line(pos+17,60,pos+a,440,c-3);
for (a=31; a<=34; a++) grx_line(pos+17,60,pos+a,440,c-3);
sem_post(&mutex); // fine sezione critica
cab_unget(cab_lghdata,(char *)p);
task_endcycle();
}
}
 
// funzione in uscita
void my_close(void *arg)
{
grx_close();
kern_printf("Bye Bye!\n");
}
 
 
int main(int argc, char **argv)
{
int modenum;
int f=48000; // frequenza di campionamento
int i=1;
HARD_TASK_MODEL m1, m2, m3;
PID p1, p2, p3;
 
cab_camdata = cab_create("camdata", sizeof(campione), 4);
cab_pwrdata = cab_create("pwr", sizeof(power), 4);
cab_lghdata = cab_create("lghdata", sizeof (lights),4);
read_file();
get_par();
sound_init((1000 * sizeof(SAMPLE)), NULL); // init sound card
sound_info(); // visualizza info sound card
init_rawdata(); // init dati usati da raw_infun
sbmixer_setoutput(0x01,ENABLE); // abilita output sonoro
sbmixer_setmiclev(MICLEV); // imposta sensibilt… input-mic
sbmixer_setAGC(AGCOP); // opzione guadagno automatico
sound_setfun(raw_infun, (int (*)(void *))-1); // inizia self-buffering
sound_sample(NULL, f, 0, DMA_OP | PCM16 | MYFUN, NULL);
cprintf("Press Enter...");
while (keyb_getchar() != 13); // premi un tasto per iniziare
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT); // fun in uscita
grx_init(); // attiva grafica
modenum = grx_getmode(640, 480, 8);
grx_setmode(modenum);
set_new_palette(); // prepara la palette
crea_scenario(); // crea lo scenario
sem_init(&mutex, 0, 1); // init graphics mutex
 
hard_task_default_model(m1); // define task m1 (fft)
hard_task_def_periodic(m1);
hard_task_def_mit(m1, PERIOD_FFT);
hard_task_def_wcet(m1, WCET_FFT);
hard_task_def_usemath(m1);
hard_task_def_group(m1, 1);
hard_task_def_stack(m1,32*1024);
p1 = task_create("fft", fft_task, &m1, NULL); // crea task m1 (fft)
if (p1 == -1) {
perror("Could not create task <fft>\n");
sys_end();
}
task_activate(p1); // attiva task m1 (fft)
 
hard_task_default_model(m2); // define task m2 (livello)
hard_task_def_periodic (m2);
hard_task_def_mit (m2, PERIOD_LIV);
hard_task_def_wcet (m2, WCET_LIV);
hard_task_def_usemath (m2);
hard_task_def_group (m2, 1);
hard_task_def_ctrl_jet (m2);
p2 = task_create("livello", livello, &m2, NULL); // crea task m2 (livello)
if (p2 == NIL) {
grx_close();
perror("Could not create task <livello>");
sys_abort(1);
}
task_activate(p2); // attiva task m2 (livello)
 
do {
hard_task_default_model(m3); // define 7 task m3 (light)
hard_task_def_periodic (m3);
hard_task_def_mit (m3, PERIOD_LIGHT);
hard_task_def_wcet (m3, WCET_LIGHT);
hard_task_def_usemath (m3);
hard_task_def_group (m3, 1);
hard_task_def_ctrl_jet (m3);
hard_task_def_arg (m3, (void *)i);
p3 = task_create("light", light, &m3, NULL); // crea 7 task m3 (light)
if (p3 == NIL) {
grx_close();
perror("Could not create task <light>");
sys_abort(1);
}
task_activate(p3); // attiva 7 task m3 (light)
i++;
} while (i<8);
 
while (keyb_getchar() != 13); // premere Invio per terminare
sys_end();
return 0;
}
 
 
/demos/branches/pj/lights/blaster.h
0,0 → 1,64
/*
* Copyright (C) 2000 Luca Abeni
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "semaphore.h"
 
 
typedef struct sb_device {
DWORD BaseAddress;
BYTE IntLine;
BYTE DMA8Channel;
BYTE DMA16Channel;
BYTE DSPVersionM;
BYTE DSPVersionm;
// WORD period;
// BYTE pwarning;
TASK_MODEL *m;
} SB_DEVICE;
 
typedef struct sound_buffer {
sem_t synchr;
BYTE synch;
struct dma_buff *sound_dma;
int (*fun)(struct dma_buff *buff);
} SOUND_BUFFER;
 
typedef struct rawfuncs {
int (*infun)(void *rawbuffer);
BYTE infunpresent;
int (*outfun)(void *rawbuffer);
BYTE outfunpresent;
} RAWFUNCS;
 
void sb_spkoff (void);
void sb_spkon (void);
int sb_init (void); // return 0 if ok or ENODEV otherwise
void sbmixer_setmiclev(BYTE level);
void sbmixer_setoutput(BYTE in, BYTE onoff);
void sbmixer_setinput(BYTE in, BYTE onoff);
void sbmixer_reset(void);
void sbmixer_setingainlev(BYTE level);
void sbmixer_setAGC(BYTE onoff);
void sb_setrate (int sps, BYTE i_o);
void sb_dmaop(BYTE i_o);
void sb_dma16op(BYTE i_o);
void sb_dmabuffop(BYTE i_o);
void sb_dma16buffop(BYTE i_o);
void sb_stopdsp(BYTE b);
void sb_show(void);
/demos/branches/pj/lights/initfile.c
0,0 → 1,88
/*
* Copyright (C) 2001 G. Vadruccio
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
// INITFILE.C per il programma SIMLIGHT
// Progetto SHARK
// Contiene le funzioni necessarie per inizializzare il sistema.
// Le funzioni registrano i moduli:
// EDF (Earliest Deadline First) level
// RR (Round Robin) level
// CBS (Costant Bandwidth Server) level
// Dummy level
// Task attivabili:
// HARD_TASK_MODEL (wcet+mit) at level 0
// SOFT_TASK_MODEL (met, period) at level 1
// NRT_TASK_MODEL at level 2
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 1000
 
void read_file(void);
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
read_file();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/demos/branches/pj/lights/param.dat
0,0 → 1,21
----------------------------------------------------
WCET_FFT: 2850
PERIOD_FFT: 30000
 
WCET_LIV: 2850
PERIOD_LIV: 30000
 
WCET_LIGHT: 3900
PERIOD_LIGHT: 43500
 
AGC: 0
MICLEV: 22
 
ATT1: 9500
ATT2: 1800
ATT3: 1600
ATT4: 100
ATT5: 400
ATT6: 300
ATT7: 200
----------------------------------------------------
/demos/branches/pj/lights/readme.txt
0,0 → 1,71
Simlight
--------
 
This project was done by Giancarlo Vadruccio, university of Pavia, as
an Assignment in the corse of Informatic Engineering.
 
Unfortunately part of the documentation is in italian, if you have any problem
please send me an e-mail.
 
Paolo
 
...and here is the original description...
 
S I M L I G H T
Progetto SHARK realizzato da Giancarlo Vadruccio.
 
- DESCRIZIONE DEL PROGRAMMA
Il programma simula graficamente l'azionamento automatico di luci pilotato da
un segnale audio collegato all'ingresso microfonico di una scheda audio Sound
Blaster 16. L'intensit… luminosa del faro dipende dalla potenza del segnale
audio e ogni faro Š sensibile ad una determinata gamma di frequenze sonore e
quindi di strumenti. Ciascun faro, infatti, Š azionato dal valore medio della
potenza di una determinata banda di frequenze. I fari sono disposti in ordine
da sinistra verso destra, dalle frequenze pi— basse (grancassa, basso, ecc..)
a quelle pi— alte (crash, piatti, charleston, ecc.).
 
- REQUISITI DI SISTEMA
Il programma Š stato realizzato su un sistema AMD DURON 800 MHz con bus di
memoria a 133 MHz, sul quale funziona correttamente. Su sistemi pi— lenti, al
fine di garantire la schedulabilit… dei processi, sarebbe necessario
aumentare il periodo di ogni task (e il wcet) rischiando per• di rendere meno
realistica la simulazione (periodo e wcet sono modificabili da file PARAM.DAT).
Inoltre Š necessario installare una scheda audio Sound Blaster 16 con i
relativi driver DOS.
Tutte le funzioni e librerie usate sono quelle standard di SHARK
(distribuzione Giugno 2001). Per usare il programma Š sufficiente lanciare
(dall'ambiente DOS/SHARK) il comando <X SIMLIGHT> dalla directory
dell'applicazione (se necessario ricompilare con il comando <MAKE> nella stessa
directory).
 
- SORGENTE SONORA
Come sorgente sonora Š possibile usare un lettore CD o un microfono. In
entrambi i casi l'uscita del segnale audio deve essere collegata all'ingresso
microfonico della scheda audio tramite un apposito cavetto di collegamento.
Se si usa un lettore CD, il cui segnale d'uscita Š molto pi— potente di quello
di un microfono, Š necessario disabilitare la funzione AGC (Automatic Gain
Control) modificando il file PARAM.DAT ed inoltre si deve regolare il volume
di uscita della sorgente in modo da avere una buona dinamica della simulazione:
un volume troppo alto saturerebbe i livelli di input facendo restare sempre
accesi i fari, viceversa un volume troppo basso non sarebbe sufficiente ad
accendere alcun faro. E' comunque possibile modificare la sensibilit…
dell'ingresso variando il parametro MICLEV nel file PARAM.DAT.
Se si usa un microfono come sorgente sonora Š necessario sia abilitare la
funzione AGC sia portare al livello massimo la sensibilit… dell'ingresso
modificando il parametro MICLEV, entrambi nel file PARAM.DAT.
 
- MODIFICA DEI PARAMETRI NEL FILE PARAM.DAT
Il file PARAM.DAT Š un file di testo contenente alcuni parametri
dell'applicazione. In particolare contiene: i valori del periodo e del wcet dei
task, la funzione AGC (0=disabilit., 1=abilit.), il valore della sensibilit…
dell'ingresso (range 0-31 : 0=min sensibilità, 31=max sensibilità), i valori
dell'attenuazione specifica di ogni faro espressi con un numero intero compreso
tra 1 (minima attenuazione) e n.
Questi ultimi valori dipendono dalla risposta in frequenza del particolare
lettore CD o microfono che si usa: se alcune frequenze sono + o - attenuate
di altre, alcuni fari risultano troppo luminosi e altri troppo poco. Variando
i valori dell'attenuazione specifica di ogni faro Š possibile correggere questo
comportamento (se un faro Š troppo acceso si deve aumentare il corrispondente
valore di attenuazione, viceversa se Š poco luminoso, lo si deve diminuire).
In ogni caso, prima di modificare questi parametri, si deve regolare in maniera
ottimale il livello del volume della sorgente audio come specificato prima.
/demos/branches/pj/lights/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= simlight
 
include $(BASE)/config/example.mk
 
simlight:
make -f $(SUBMAKE) APP=simlight INIT= OTHEROBJS="initfile.o "
 
/demos/branches/pj/pci6025e/test_bms.c
0,0 → 1,279
/*****************************************************************************
* Filename: test_bms.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 27/06/2001 *
* Description: Test program for buffered period and semiperiod measurement *
* capacity of National PCI6025E board *
*----------------------------------------------------------------------------*
* Notes: FOUT are enable and avaiable on pin 50 to provide 1 Mhz frequency *
* You should connect source 0 (PIN 41) and source 1 (pin 45) to this *
* freq source. Gate 0 (pin 42) and gate 1 (pin 44) must be connected *
* rispectivly to DIO7 (pin 32) and DIO6 (pin 30). *
* Use 'g' button to activate gate_action_task which generate a square *
* wave with a freq of 0.5 Hz and Duty cycle of 75%. *
* 's' button should show counters countent but gate_action_task *
* when active shows counters content automatically so 's' button isn't*
* useful. *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
#include <drivers/pci6025e/timer.h>
#include <drivers/pci6025e/dio_ppi.h>
 
#define SHOW_MET 30000
#define SHOW_WCET 50000
#define SHOW_PERIOD 1000000
 
#define GATE_MET 2000
#define GATE_WCET 5000
#define GATE_PERIOD 2000000
 
#define GATE_ACTION_P 500000
#define GATE_ACTION_W 10000
 
#define black rgb16(0, 0, 0)
 
void endFun(KEY_EVT *);
void gateEvent(KEY_EVT *);
void showEvent(KEY_EVT *);
 
void closeEvent(void *);
 
void drawInterface(void);
 
TASK show_val_body(int);
TASK gate_action_body(int);
 
BYTE sys = 0;
PID show_val_pid, gate_action_pid;
 
int main(int argc, char **argv)
{
KEY_EVT k;
int modenum;
SOFT_TASK_MODEL show_val_mod;
HARD_TASK_MODEL gate_action_model;
 
sys_atrunlevel(closeEvent, NULL, RUNLEVEL_BEFORE_EXIT);
 
k.flag = CNTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endFun);
 
k.flag = CNTR_BIT;
keyb_hook(k, endFun);
 
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
keyb_hook(k, gateEvent);
 
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, showEvent);
 
if(pci_init()==-1){
sys = 10;
sys_end();
}
 
if(!reMap()){
sys = 11;
sys_end();
}
 
soft_task_default_model(show_val_mod);
soft_task_def_aperiodic(show_val_mod);
soft_task_def_level(show_val_mod, 1);
soft_task_def_met(show_val_mod, SHOW_MET);
soft_task_def_wcet(show_val_mod, SHOW_WCET);
soft_task_def_period(show_val_mod, SHOW_PERIOD);
if( (show_val_pid = task_create("Show task", show_val_body, &show_val_mod, NULL))
== NIL ){
sys = 20;
sys_end();
}
 
hard_task_default_model(gate_action_model);
hard_task_def_mit(gate_action_model, GATE_ACTION_P);
hard_task_def_wcet(gate_action_model, GATE_ACTION_W);
if( (gate_action_pid = task_create("Gate Action", gate_action_body, &gate_action_model, NULL))
== NIL ){
sys = 22;
sys_end();
}
 
if(grx_init()==-1){
sys = 30;
sys_end();
}
 
if( (modenum = grx_getmode(800, 600, 16)) == -1){
sys = 31;
sys_end();
}
 
if(grx_setmode(modenum) == -1){
sys = 32;
sys_end();
}
 
drawInterface();
 
DIO_init();
DIO_setup(0xFF);
DIO_write(0x00);
 
//All PFI configured as input
PFIprogramming(0x0000);
 
//Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10
setIntClock(0, 1, 10);
 
//Reset both counters
TIM_reset(2);
 
//C0 measures period on PFI3 with gate from PFI 4 driven by DIO7
TIM_bufferedTimeMeasurement(C0, 0x04, 0x45, 0, 0);
 
//C1 measures semiperiod on PFI 6 with gate from PFI 5 driven by FIO6
TIM_bufferedTimeMeasurement(C1, 0x87, 0x46, 1, 0);
 
//arm both counters
TIM_arm(2);
 
return 0;
}
 
void endFun(KEY_EVT *k)
{
sys_end();
}
 
void showEvent(KEY_EVT *k)
{
task_activate(show_val_pid);
}
 
void gateEvent(KEY_EVT *k)
{
task_activate(gate_action_pid);
}
 
void drawInterface(void)
{
grx_rect(1, 1, 799, 129, rgb16(105, 0, 0));
grx_rect(2, 2, 798, 128, rgb16(155, 0, 0));
grx_rect(3, 3, 797, 127, rgb16(205, 0, 0));
grx_rect(4, 4, 796, 126, rgb16(255, 0, 0));
 
grx_text("Test program for Buffered Period and Semiperiod measure through PCI6025E timers",
7, 10, rgb16(50, 255, 50), black);
 
grx_text("This program counting rise edges on counters source (PFI3 & PFI6) between two rising",
7, 25, rgb16(0, 255, 255), black);
grx_text("edges on gate (PFI 42) and beetwen each gate edge (PFI44).FOUT is enabled and",
7, 33, rgb16(0, 255, 255), black);
grx_text("provides a frequency of 1 MHz", 7, 41, rgb16(0, 255, 255), black);
grx_text("Instruction:",7, 53, rgb16(255, 0, 0), black);
grx_text("Use 's' to see counters value",
7, 61, rgb16(0, 255, 255), black);
grx_text("Use 'g' to enbale automatic tasks which generate square wave with freq of 0.5Hz",
7, 68, rgb16(0, 255, 255), black);
 
grx_text("And duty cycle of 75%. Counter 0 must be loaded with about 2E6 ticks and counter 1",
7, 75, rgb16(0, 255, 255), black);
grx_text("must be loaded alternativly with about 1.5E6 and 0.5E6 ticks",
7, 83, rgb16(0, 255, 255), black);
 
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
7, 95, rgb16(0, 255, 0), black);
grx_text("CTRL-X for Exit", 7, 110, rgb16(200, 200, 0), black);
 
grx_rect(1, 147, 355, 183, rgb16(0, 105, 0));
grx_rect(2, 148, 354, 182, rgb16(0, 155, 0));
grx_rect(3, 149, 353, 181, rgb16(0, 205, 0));
grx_rect(4, 150, 352, 180, rgb16(0, 255, 0));
grx_text("Period", 7, 155, rgb16(255, 255, 0), black);
 
grx_rect(455, 147, 799, 183, rgb16(0, 105, 0));
grx_rect(456, 148, 798, 182, rgb16(0, 155, 0));
grx_rect(457, 149, 797, 181, rgb16(0, 205, 0));
grx_rect(458, 150, 796, 180, rgb16(0, 255, 0));
grx_text("Semiperiod", 461, 155, rgb16(255, 0, 255), black);
}
 
TASK show_val_body(int dummy)
{
DWORD val;
char buf[40];
 
while(1){
val = TIM_readHWSaveReg(C0);
sprintf(buf,"C0 %07ld", val);
grx_text(buf, 7, 165, rgb16(255, 0, 0), rgb16(0, 0, 0));
val = TIM_readHWSaveReg(C1);
sprintf(buf,"C1 %07ld", val);
grx_text(buf, 461, 165, rgb16(0, 255, 0), rgb16(0, 0, 0));
 
task_endcycle();
}
}
 
TASK gate_action_body(int dummy)
{
int i;
i = 0;
 
while(1){
if( (i%4)==0 ) DIO_write(0xC0);
if( (i%4)==3 ) DIO_write(0x00);
 
i++;
 
task_activate(show_val_pid);
 
task_endcycle();
}
}
 
void closeEvent(void *arg)
{
grx_close();
TIM_disarm(2);
switch(sys){
case 0: cprintf("Ok\n"); break;
case 10: cprintf("No PCI\n"); break;
case 11: cprintf("No National Board\n"); break;
case 20: cprintf("task <show val> down\n"); break;
case 22: cprintf("task <gate action> down\n"); break;
case 30: cprintf("Cannot initialize grx\n"); break;
case 31: cprintf("Resolution 800x600x16 not supported\n"); break;
case 32: cprintf("Cannot sets up graphic envirorment\n"); break;
default: cprintf("????????????\n"); break;
}
}
/demos/branches/pj/pci6025e/wave.c
0,0 → 1,328
/*****************************************************************************
* Filename: wave.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 12/06/2001 *
* Description: Little test program for Analog Output section of PCI6025E *
*----------------------------------------------------------------------------*
* Notes: Connect an oscilloscope to DACs output pins (20 & 21) and *
* watch the waveforms. *
* and decrise voltage *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
 
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <modules/sem.h>
 
#include <drivers/pci6025e/dac.h>
 
#define MAX_VAL 500
 
#define WAVE_PERIOD 1000
#define WAVE_WCET 200
#define GRAPH_PERIOD 1000
#define GRAPH_WCET 550
 
#define TASK_GROUP 1
 
#define DAC0_CONV 0.1
#define DAC1_CONV 0.05
 
#define INC 40
 
void createWaves(void);
void drawInterface(void);
 
void endfun(KEY_EVT *);
void close_event(void *);
 
TASK wave_body(int);
TASK video_body(int);
 
WORD wave0[MAX_VAL], wave1[MAX_VAL];
int black = rgb16(0,0,0),
white = rgb16(255, 255, 255);
 
BYTE sys = 0;
 
int main(int argc, char **argv)
{
KEY_EVT k;
HARD_TASK_MODEL wave0, wave1;
HARD_TASK_MODEL video;
PID wave0_pid, wave1_pid, video_pid;
int modenum;
 
k.flag = CNTR_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
 
k.flag = CNTL_BIT;
keyb_hook(k, endfun);
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
hard_task_default_model(wave0);
hard_task_def_wcet(wave0, WAVE_WCET);
hard_task_def_mit(wave0, WAVE_PERIOD);
hard_task_def_arg(wave0, 0);
hard_task_def_group(wave0, TASK_GROUP);
if( (wave0_pid = task_create("Wave 0", wave_body, &wave0, NULL)) == NIL ){
sys = 10;
sys_end();
}
 
hard_task_default_model(wave1);
hard_task_def_wcet(wave1, WAVE_WCET);
hard_task_def_mit(wave1, WAVE_PERIOD);
hard_task_def_arg(wave1, (void *)1);
hard_task_def_group(wave1, TASK_GROUP);
if( (wave1_pid = task_create("Wave 1", wave_body, &wave1, NULL)) == NIL ){
sys = 11;
sys_end();
}
 
hard_task_default_model(video);
hard_task_def_wcet(video, GRAPH_WCET);
hard_task_def_mit(video, GRAPH_PERIOD);
hard_task_def_group(video, TASK_GROUP);
if( (video_pid = task_create("Video task", video_body, &video, NULL))
== NIL ){
sys = 12;
sys_end();
}
 
if(pci_init() == -1){
sys = 20;
sys_end();
}
 
if(!reMap()){
sys = 21;
sys_end();
}
 
if(grx_init() == -1){
sys = 30;
sys_end();
}
 
if( (modenum = grx_getmode(800, 600, 16)) == -1 ){
sys = 31;
sys_end();
}
 
grx_setmode(modenum);
 
createWaves();
drawInterface();
//Analog output section set up
DAC_Init();
 
/*
*AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode
*TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low
*TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode
*UPDATE signal timebase = AO_UPDATE pulse width
*UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period
*UPDATE signal polarity = HIGH Z
*/
DAC_boardInit(0x02, 0x4000);
 
/*
*LDAC0 source = UPDATE
*DAC0 update immediately
*LDAC1 source = UPDATE
*DAC1 update immediately
*/
DAC_LDACSourceUpdate(0x00);
//End of Analog output section setup
 
 
group_activate(TASK_GROUP);
 
return 0;
}
 
void endfun(KEY_EVT *k)
{
sys_end();
}
 
void close_event(void *arg)
{
grx_close();
switch(sys){
case 0: cprintf("Regular End!\n"); break;
case 10: cprintf("Cannot create <wave 0> task!\n"); break;
case 11: cprintf("Cannot create <wave 1> task!\n"); break;
case 12: cprintf("Cannot create <video> task!\n"); break;
case 20: cprintf("No PCI bus found!\n"); break;
case 21: cprintf("No NATIONAL PCI E-Series board found on PCI bus!\n");
break;
case 30: cprintf("Cannot start graphic envirorment!\n"); break;
case 31: cprintf("800x600x16 video mode not supported!\n");
default: cprintf("Unknown exit event!\n"); break;
}
}
 
/*
* Wave's samples generation
*/
void createWaves(void)
{
int i;
WORD value0, value1;
BYTE direction;
 
/* Wave0
* * * * * * * *
** ** ** ** ** ** ** **
* ** * * ** ** ** ** ** *
* * ** * * * * * *
--------------------------...
 
Wave 1
* *
* * * *
* * * *
* * * *
-------*-------*-------*--...
* * *
* * *
* *
* */
 
value0 = 0;
value1 = 0;
direction = 0;
for(i=0; i<MAX_VAL; i++){
wave0[i] = (value0 & 0x0FFF);
wave1[i] = (value1 & 0x0FFF);
 
value0 = (value0 + INC) % 2000;
if(!direction) value1 += INC;
else value1 -= INC;
 
if(value1 >= 2000) direction = 1;
if(value1 <= -2000) direction = 0;
}
}
 
void drawInterface(void)
{
int i;
 
grx_rect(1, 1, 799, 69, rgb16(105, 0, 105));
grx_rect(2, 2, 798, 68, rgb16(155, 0, 155));
grx_rect(3, 3, 797, 67, rgb16(205, 0, 205));
grx_rect(4, 4, 796, 66, rgb16(255, 0, 255));
 
grx_text("Test program for Analog output section of PCI6025E",
7, 10, rgb16(50, 255, 50), black);
grx_text("DAC0 and DAC1 should generate saw-toothed wave and triangular wave",
7, 33, rgb16(0, 255, 255), black);
grx_text("Use an oscilloscope to test this software",
7, 40, rgb16(0, 255, 255), black);
 
grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
 
grx_text("DAC 0", 100, 92, rgb16(200, 200, 0), black);
grx_rect(1, 100, 799, 325, rgb16(0, 105, 0));
grx_rect(2, 101, 798, 324, rgb16(0, 155, 0));
grx_rect(3, 102, 797, 323, rgb16(0, 205, 0));
grx_rect(4, 103, 796, 322, rgb16(0, 255, 0));
grx_line(19, 115, 19, 320, white);
grx_line(14, 315, 530, 315, white);
 
grx_text("DAC 1", 100, 362, rgb16(200, 200, 0), black);
grx_rect(1, 370, 799, 595, rgb16(105, 0, 0));
grx_rect(2, 371, 798, 594, rgb16(155, 0, 0));
grx_rect(3, 372, 797, 593, rgb16(205, 0, 0));
grx_rect(4, 373, 796, 592, rgb16(255, 0, 0));
grx_line(19, 385, 19, 585, white);
grx_line(14, 485, 530, 485, white);
 
for(i=22; i<530; i+=2){
//DAC0
grx_plot(i, 115, white);
grx_plot(i, 215, white);
//DAC1
grx_plot(i, 385, white);
grx_plot(i, 435, white);
grx_plot(i, 535, white);
grx_plot(i, 585, white);
}
 
grx_text("5 V", 540, 211, rgb16(0, 255, 0), black);
grx_text("10 V", 540, 111, rgb16(0, 255, 0), black);
grx_text("+5 V", 540, 431, rgb16(0, 255, 0), black);
grx_text("+10 V", 540, 381, rgb16(0, 255, 0), black);
grx_text("-5 V", 540, 531, rgb16(255, 0, 0), black);
grx_text("-10 V", 540, 581, rgb16(255, 0 , 0), black);
}
 
/*
* Sends out waves' samples
*/
TASK wave_body(int wv)
{
int i = 0;
while(1){
if(wv)
DAC_output(DAC1, wave1[i]);
else
DAC_output(DAC0, wave0[i]);
 
i = (i + 1) % 500;
task_endcycle();
}
}
 
/*
* Shows wave on screen
*/
TASK video_body(int dummy)
{
int i = 0;
int n_tmp, o_tmp;
//char buf[10];
 
while(1){
o_tmp = n_tmp;
if( (wave1[i] & 0x0800) != 0 ) n_tmp = wave1[i]-0x0FFF;
else n_tmp = wave1[i];
 
if(i>0){
grx_line(19+i, 314-wave0[i-1]*DAC0_CONV,
20+i, 314-wave0[i]*DAC0_CONV, rgb16(255, 255, 0));
grx_line(19+i, 485-o_tmp*DAC1_CONV,
20+i, 485-n_tmp*DAC1_CONV, rgb16(0, 255, 255));
}
 
i = (i + 1) % 500;
task_endcycle();
}
}
/demos/branches/pj/pci6025e/initfile.c
0,0 → 1,63
/*
* Filename: Initfile.c
* Author: Marco Ziglioli (Doctor Stein)
* Date: (I don't remeber... I'm sorry)
* Description: this file is the same for every examples in this section
*/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <modules/edf.h>
#include <modules/cbs.h>
#include <modules/rr.h>
#include <modules/hartport.h>
#include <modules/dummy.h>
#include <modules/sem.h>
 
#include <drivers/keyb.h>
 
#define TICK 1000
#define RRTICK 5000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
/demos/branches/pj/pci6025e/test_mes.c
0,0 → 1,290
/*****************************************************************************
* Filename: test_mes.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 25/06/2001 *
* Description: Test file for single period and pulsewidth measurement feature*
* of PCI6025E timers/counters *
*----------------------------------------------------------------------------*
* Notes: board is configured to provide a frequency of 1 MHZ through its FOUT*
* pin (50). PFI3 (41) and PFI6 (45) are configured like source pins *
* counter 0 and counter 1. PFI4 (42) and PFI 5(44) are the gates for *
* the two counters. Please connect DIO7(32) to PFI4 and DIO6(30) to *
* PFI 5. *
* With 'g' key a task is started which generate a square wave on DIO7 *
* with a period of 2 secs. With 'h' key the same square wave is *
* generated on DIO6. *
* When measurement is performed data are stored into Hardware Save *
* Registers: use key 's' to show this values *
*****************************************************************************/
 
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include <kernel/kern.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
#include <drivers/pci6025e/timer.h>
#include <drivers/pci6025e/dio_ppi.h>
 
#define TASK_MET 20000
#define TASK_WCET 50000
#define TASK_PERIOD 100000
 
#define PERIOD 1000000
 
void endFun(KEY_EVT *);
void gateEvent(KEY_EVT *);
 
void drawInterface(void);
void closeEvent(void *);
 
TASK show_body(int);
TASK gate_body(int);
 
BYTE sys = 0;
PID c0_gate_pid, c1_gate_pid, show_pid;
int black = rgb16(0, 0, 0);
 
int main(int argc, char **argv)
{
KEY_EVT k;
int modenum;
SOFT_TASK_MODEL show_model;
HARD_TASK_MODEL gating;
 
sys_atrunlevel(closeEvent, NULL, RUNLEVEL_BEFORE_EXIT);
 
k.flag = CNTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endFun);
 
k.flag = CNTR_BIT;
keyb_hook(k, endFun);
 
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
keyb_hook(k, gateEvent);
 
k.scan = KEY_H;
k.ascii = 'h';
keyb_hook(k, gateEvent);
 
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, gateEvent);
 
if(pci_init()==-1){
sys = 10;
sys_end();
}
 
if(!reMap()){
sys = 11;
sys_end();
}
 
soft_task_default_model(show_model);
soft_task_def_level(show_model, 1);
soft_task_def_met(show_model, TASK_MET);
soft_task_def_wcet(show_model, TASK_WCET);
soft_task_def_aperiodic(show_model);
soft_task_def_period(show_model, TASK_PERIOD);
if( (show_pid = task_create("Show task", show_body, &show_model, NULL))
== NIL ){
sys = 20;
sys_end();
}
 
hard_task_default_model(gating);
hard_task_def_mit(gating, PERIOD);
hard_task_def_wcet(gating, 20000);
hard_task_def_arg(gating, C0);
if( (c0_gate_pid = task_create("C0 Gate task", gate_body, &gating, NULL)) == NIL ){
sys = 21;
sys_end();
}
 
hard_task_def_arg(gating, (void *)C1);
if( (c1_gate_pid = task_create("C1 Gate task", gate_body, &gating, NULL)) == NIL ){
sys = 22;
sys_end();
}
 
if(grx_init()==-1){
sys = 30;
sys_end();
}
 
if( (modenum = grx_getmode(800, 600, 16)) == 0 ){
sys = 31;
sys_end();
}
 
grx_setmode(modenum);
drawInterface();
//Enable DIO to manage gates
DIO_init();
DIO_setup(0xFF);
DIO_write(0x00);
 
//All PFI configured as input
PFIprogramming(0x0000);
//Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10
setIntClock(0, 1, 10);
 
//Reset both counters
TIM_reset(2);
//Source PFI3(41); Gate PFI 4(42); Measure period
TIM_timeMeasurement(C0, 0x04, 0x45, 0, 0x00, 0);
//Source PFI6(45); Gate PFI 5(44); Measure pulsewidth
TIM_timeMeasurement(C1, 0x87, 0x46, 1, 0x00, 0);
 
//Arm both counter
TIM_arm(2);
 
return 0;
}
 
TASK show_body(int dummy)
{
DWORD val;
char buf[20];
 
while(1){
val = TIM_readHWSaveReg(C0);
sprintf(buf, "%ld", val);
grx_text(buf, 600, 471, rgb16(0, 255, 0), black);
val = TIM_readHWSaveReg(C1);
sprintf(buf, "%ld", val);
grx_text(buf, 200, 471, rgb16(255, 0, 0), black);
 
task_endcycle();
}
}
 
TASK gate_body(int counter)
{
BYTE out;
 
if(counter == C0) out = 0x80;
else out = 0x40;
 
while(1){
DIO_write(out);
if(counter == C0){
if(out) out = 0x00;
else out = 0x80;
} else {
if(out) out = 0x40;
else out = 0x00;
}
 
task_endcycle();
}
}
 
void drawInterface(void)
{
grx_rect(1, 1, 799, 120, rgb16(105, 0, 0));
grx_rect(2, 2, 798, 119, rgb16(155, 0, 0));
grx_rect(3, 3, 797, 118, rgb16(205, 0, 0));
grx_rect(4, 4, 796, 117, rgb16(255, 0, 0));
 
grx_text("Test program for single period and pulsewidth measurement features",
7, 10, rgb16(200, 200, 0), black);
 
grx_text("This program measures single period and pulsewidth of a square wave",
7, 20, rgb16(0, 255, 0), black);
grx_text("with frequency of 0.5 Hz", 7, 28, rgb16(0, 255, 0), black);
grx_text("Please connect PFI3 & PFI6 (41 & 45) to FOUT pin (50) or to 1Mhz frequency source",
7, 40, rgb16(255, 0, 0), black);
grx_text("Connect also DIO7 (32) to PFI4 (42) and DIO6 to PFI5 (44)",
7, 48, rgb16(255, 0, 0), black);
grx_text("Commands:", 7, 60, rgb16(0, 120, 0), black);
grx_text("Use 'g' to start wave generation on DIO7",
7, 70, rgb16(0, 255, 255), black);
grx_text("Use 'h' to start wave generation on DIO6",
7, 78, rgb16(0, 255, 255), black);
grx_text("Use 's' to show Hardware Save Registers content",
7, 86, rgb16(0, 255, 255), black);
grx_text("CTRL-X to exit", 7, 105, rgb16(255, 255, 0), black);
 
grx_rect(197, 127, 603, 423, rgb16(0, 255, 0));
grx_rect(198, 128, 602, 422, rgb16(0, 205, 0));
grx_rect(199, 129, 601, 421, rgb16(0, 155, 0));
grx_rect(200, 130, 600, 420, rgb16(0, 105, 0));
grx_line(215, 405, 215, 150, rgb16(255, 255, 255));
grx_line(210, 400, 580, 400, rgb16(255, 255, 255));
grx_line(220, 395, 220, 170, rgb16(0, 0, 255));
grx_line(220, 170, 390, 170, rgb16(0, 0, 255));
grx_line(390, 170, 390, 395, rgb16(0, 0, 255));
grx_line(390, 395, 560, 395, rgb16(0, 0, 255));
grx_line(220, 150, 560, 150, rgb16(0, 255, 0));
grx_line(220, 155, 390, 155, rgb16(255, 0, 0));
 
grx_rect(1, 450, 390, 503, rgb16(105, 0, 0));
grx_rect(2, 451, 389, 502, rgb16(155, 0, 0));
grx_rect(3, 452, 388, 501, rgb16(205, 0, 0));
grx_rect(4, 453, 387, 500, rgb16(255, 0, 0));
grx_text("Pulsewidth: [us]", 7, 471, rgb16(255, 0, 0), black);
 
grx_rect(410, 450, 799, 503, rgb16(105, 0, 0));
grx_rect(411, 451, 798, 502, rgb16(155, 0, 0));
grx_rect(412, 452, 797, 501, rgb16(205, 0, 0));
grx_rect(413, 453, 796, 500, rgb16(255, 0, 0));
grx_text("Period: [us]", 416, 471, rgb16(0, 255, 0), black);
}
 
void endFun(KEY_EVT *k)
{
sys_end();
}
 
void gateEvent(KEY_EVT *k)
{
if(k->scan == KEY_G) task_activate(c0_gate_pid);
if(k->scan == KEY_H) task_activate(c1_gate_pid);
if(k->scan == KEY_S) task_activate(show_pid);
}
 
void closeEvent(void *arg)
{
TIM_disarm(2);
grx_close();
 
switch(sys){
case 0: cprintf("OK\n"); break;
case 10: cprintf("No PCI bus found\n"); break;
case 11: cprintf("No NATIONAL board found\n"); break;
case 20: cprintf("task <show value> down!!\n"); break;
case 21: cprintf("task <C0 gate manage> down!!!\n"); break;
case 22: cprintf("task <C1 gate manage> down!!!\n"); break;
case 30: cprintf("Cannot init graphic envirorment\n"); break;
case 31: cprintf("graphic mode 800x600x16 not supported\n"); break;
default: cprintf("???????????????\n"); break;
}
}
/demos/branches/pj/pci6025e/test_ec.c
0,0 → 1,405
/*****************************************************************************
* Filename: test_ec.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 20/06/2001 *
* Description: Test program for gated event counting using PCI6025E board *
*----------------------------------------------------------------------------*
* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could *
* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting *
* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for *
* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 *
* are als configured to switch between 0 and 5 V. Connect DIO 7 to *
* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) *
* to change DIO lines value. On left area of the screen you should *
* see counter while counting and on the right area you should lock *
* counter values by pressing 's' key. *
* Notice that line parameters are enabled and accept inital value *
* for the two counters. If they aren't specified or they are wrong *
* counters start from 0x00FFFFFF (counter 0 which counts down) and *
* 0x00000000 (counter 1 which counts up). *
* Last time addiction: TC Interrupts and Gate interrupts are enabled *
* Bottom squares indicates when an interrupt is *
* raised *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
#include <drivers/pci6025e/timer.h>
#include <drivers/pci6025e/dio_ppi.h>
 
#ifndef INT_NO
#define INT_NO NIDevice_info[0].InterruptLevel
#endif
 
BYTE sys = 0;
 
PID show_aper_pid;
BYTE out = 0x00;
 
int black = rgb16(0, 0, 0),
white = rgb16(255, 255, 255);
 
void endfun(KEY_EVT *);
void close_event(void *);
void show_evt(KEY_EVT *k);
void gate_change(KEY_EVT *k);
 
void drawInterface(void);
 
void int_evt(int intno);
 
TASK show_per(int);
TASK show_aper(int);
 
int main(int argc, char **argv)
{
KEY_EVT k;
SOFT_TASK_MODEL show_per_mod, show_aper_mod;
PID show_per_pid;
int result, modenum;
DWORD init_val_c0, init_val_c1;
 
if(argc >= 3){
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
init_val_c0 = 0x00FFFFFF;
if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1)
init_val_c1 = 0x00000000;
}
if(argc == 2){
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
init_val_c0 = 0x00FFFFFF;
init_val_c1 = 0x00000000;
}
if(argc == 1){
init_val_c0 = 0x00FFFFFF;
init_val_c1 = 0x00000000;
}
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
k.flag = CNTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
 
k.flag = CNTR_BIT;
keyb_hook(k, endfun);
 
soft_task_default_model(show_aper_mod);
soft_task_def_aperiodic(show_aper_mod);
soft_task_def_level(show_aper_mod, 1);
soft_task_def_period(show_aper_mod, 250000);
soft_task_def_met(show_aper_mod, 30000);
soft_task_def_wcet(show_aper_mod, 60000);
if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){
sys = 10;
sys_end();
}
 
k.flag = 0;
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, show_evt);
 
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
keyb_hook(k, gate_change);
 
k.scan = KEY_H;
k.ascii = 'h';
keyb_hook(k, gate_change);
 
soft_task_default_model(show_per_mod);
soft_task_def_level(show_per_mod, 1);
soft_task_def_met(show_per_mod, 1000);
soft_task_def_period(show_per_mod, 10000);
if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){
sys = 11;
sys_end();
}
 
if(pci_init()==-1){
sys = 20;
sys_end();
}
 
if(!reMap()){
sys = 21;
sys_end();
}
 
if(grx_init()==-1){
sys = 30;
sys_end();
}
 
if( (modenum = grx_getmode(800, 600, 16)) == -1){
sys = 31;
sys_end();
}
 
grx_setmode(modenum);
 
drawInterface();
//Init DIO lines used to manage counters gates
DIO_init();
DIO_setup(0xFF);
DIO_write(out);
 
//All PFI are configured as input
PFIprogramming(0x0000);
//FOUT enable; Slow TIMEBASE, divided by two; divided by 16 on FOUT pin
setIntClock(1, 1, 0);
 
TIM_reset(2); //Reset both two counters
 
//Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge;
TIM_eventCounting(C0, 0x04, 0x45, 0x03, init_val_c0);
 
//Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge;
TIM_eventCounting(C1, 0x87, 0x46, 0x03, init_val_c1);
 
//Set up interrupt group A and B enabling and programming to assert a request
//both on line 2 and 3 respectively
INT_setup(0x0A, 0x0B);
INT_personalize(0x03); //Interrupt request polarity low; IRQ driven on line 0 and 1
 
handler_set(INT_NO, int_evt, show_aper_pid);
 
TIM_arm(2); //Arm both two counters
 
task_activate(show_per_pid);
 
return 0;
}
 
void drawInterface(void)
{
grx_rect(1, 1, 799, 99, rgb16(105, 0, 0));
grx_rect(2, 2, 798, 98, rgb16(155, 0, 0));
grx_rect(3, 3, 797, 97, rgb16(205, 0, 0));
grx_rect(4, 4, 796, 96, rgb16(255, 0, 0));
 
grx_text("Test program for Gated Event Counting capacity of PCI6025E timers",
7, 10, rgb16(50, 255, 50), black);
 
grx_text("This program counting rise edges on counters source (PFI3 & PFI6) when releted gates",
7, 25, rgb16(0, 255, 255), black);
grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz",
7, 33, rgb16(0, 255, 255), black);
 
grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black);
grx_text("Use 's' to lock counters value in right squares",
7, 51, rgb16(0, 255, 255), black);
grx_text("Use 'g' to block or to release alternativly counter 0 (see top-left square)",
7, 58, rgb16(0, 255, 255), black);
 
grx_text("Use 'h' to block or to release alternativly counter 1 (see bottom-left square)",
7, 65, rgb16(0, 255, 255), black);
 
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
7, 78, rgb16(0, 255, 0), black);
grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black);
 
grx_rect(1, 110, 355, 170, rgb16(0, 105, 0));
grx_rect(2, 111, 354, 169, rgb16(0, 155, 0));
grx_rect(3, 112, 353, 168, rgb16(0, 205, 0));
grx_rect(4, 113, 352, 167, rgb16(0, 255, 0));
grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black);
 
grx_rect(455, 110, 799, 170, rgb16(0, 105, 0));
grx_rect(456, 111, 798, 169, rgb16(0, 155, 0));
grx_rect(457, 112, 797, 168, rgb16(0, 205, 0));
grx_rect(458, 113, 796, 167, rgb16(0, 255, 0));
grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black);
 
grx_rect(360, 110, 450, 170, rgb16(0, 105, 0));
grx_rect(361, 111, 449, 169, rgb16(0, 155, 0));
grx_rect(362, 112, 448, 168, rgb16(0, 205, 0));
grx_rect(363, 113, 447, 167, rgb16(0, 255, 0));
grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black);
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
 
grx_rect(1, 190, 355, 260, rgb16(85, 85, 255));
grx_rect(2, 191, 354, 259, rgb16(135, 135, 255));
grx_rect(3, 192, 353, 258, rgb16(190, 190, 255));
grx_rect(4, 193, 352, 257, rgb16(230, 239, 255));
grx_text("Counter 1 evolution", 7, 200, white, black);
 
grx_rect(455, 190, 799, 260, rgb16(85, 85, 255));
grx_rect(456, 191, 798, 259, rgb16(135, 135, 255));
grx_rect(457, 192, 797, 258, rgb16(190, 190, 255));
grx_rect(458, 193, 796, 257, rgb16(230, 230, 255));
grx_text("Counter 1 locked value", 461, 200, white, black);
 
grx_rect(360, 190, 450, 260, rgb16(85, 85, 255));
grx_rect(361, 191, 449, 259, rgb16(135, 135, 255));
grx_rect(362, 192, 448, 258, rgb16(190, 190, 255));
grx_rect(363, 193, 447, 257, rgb16(230, 230, 255));
grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black);
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
 
grx_text("Counter 0 Interrupt events", 7, 340, rgb16(255, 200, 100), black);
grx_text("Counter 1 Interrupt events", 461, 340, rgb16(255, 200, 100), black);
grx_rect(1, 350, 355, 400, rgb16(105, 0, 0));
grx_rect(2, 351, 354, 399, rgb16(155, 0, 0));
grx_rect(3, 352, 353, 398, rgb16(205, 0, 0));
grx_rect(4, 353, 352, 397, rgb16(255, 0, 0));
grx_rect(455, 350, 799, 400, rgb16(105, 0, 0));
grx_rect(456, 351, 798, 399, rgb16(155, 0, 0));
grx_rect(457, 352, 797, 398, rgb16(205, 0, 0));
grx_rect(458, 353, 796, 397, rgb16(255, 0, 0));
}
 
 
TASK show_per(int none)
{
DWORD val;
char buf[30];
 
while(1){
val = TIM_readCounter(C0); //Read counter 0 value
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
grx_text(buf, 7, 145, rgb16(255, 0, 0), black);
 
val = TIM_readCounter(C1); //Read counter 1 value
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
grx_text(buf, 7, 225, rgb16(255, 0, 0), black);
 
task_endcycle();
}
}
 
TASK show_aper(int dummy)
{
DWORD val;
char buf[30];
 
while(1){
val = TIM_readCounter(C0);
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
grx_text(buf, 461, 145, rgb16(80, 80, 255), black);
 
val = TIM_readCounter(C1);
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
grx_text(buf, 461, 225, rgb16(80, 80, 255), black);
 
task_endcycle();
}
}
 
void endfun(KEY_EVT *k)
{
sys_end();
}
 
void show_evt(KEY_EVT *k)
{
task_activate(show_aper_pid);
}
 
void gate_change(KEY_EVT *k)
{
if(k->ascii == 'g'){
if( (out & 0x80) != 0){
out &= 0x7F;
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
} else {
out |= 0x80;
grx_text("5 V", 367, 145, rgb16(0, 255, 0), black);
}
} else {
if( (out & 0x40) != 0){
out &= 0xBF;
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
} else {
out |= 0x40;
grx_text("5 V", 367, 225, rgb16(0, 255, 0), black);
}
}
 
DIO_write(out);
}
 
void close_event(void *arg)
{
TIM_disarm(2); //Disable both two counters
grx_close();
handler_remove(INT_NO);
 
 
switch(sys){
case 0: cprintf("OK\n"); break;
case 10: cprintf("Task <show aperiodic> down\n"); break;
case 11: cprintf("Task <show periodic> down\n"); break;
case 20: cprintf("No PCI bus\n"); break;
case 21: cprintf("No National board on PCI bus\n"); break;
case 30: cprintf("No graphic can be initialized\n"); break;
case 31: cprintf("This graphic mode cannot be supported\n"); break;
default: cprintf("???????????\n"); break;
}
}
 
void int_evt(int intno)
{
WORD status;
 
status = DAQ_STC_Windowed_Mode_Read(AI_STATUS_1);
if( (status & 0x8000) != 0){
if( (status & 0x0008) != 0){
grx_text("INT Group A raised! G0 Rolls over", 7, 360, rgb16(0, 255, 0), black);
set(interrupt_a_ack, 14);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack);
clr(interrupt_a_ack, 14);
}
if( (status & 0x0004) != 0){
grx_text("INT Group A raised! G0 gate pressed", 7, 380, rgb16(0, 255, 0), black);
set(interrupt_a_ack, 15);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack);
clr(interrupt_a_ack, 15);
}
return;
}
 
status = DAQ_STC_Windowed_Mode_Read(AO_STATUS_1);
if( (status & 0x8000) != 0){
if( (status & 0x0008) != 0){
grx_text("INT Group B raised! G1 Rolls over", 461, 360, rgb16(0, 255, 0), black);
set(interrupt_b_ack, 14);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack);
clr(interrupt_b_ack, 14);
}
if( (status & 0x0004) != 0){
grx_text("INT Group B raised! G1 gate pressed", 461, 380, rgb16(0, 255, 0), black);
set(interrupt_b_ack, 15);
DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack);
clr(interrupt_b_ack, 15);
}
return;
}
}
/* End of file: Test_ec.c */
/demos/branches/pj/pci6025e/test_dac.c
0,0 → 1,364
/*****************************************************************************
* Filename: test_dac.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 12/06/2001 *
* Description: Little test program for Analog Output section of PCI6025E *
*----------------------------------------------------------------------------*
* Notes: Connect a multimeter to DAC1 output (pin 21) and watch *
* tension value. Use '+' and '-' on numeric pad to increase *
* and decrise voltage *
* With this program it's possible to point out possible *
* offset errors. To correct them no software are written but *
* in National board package there's the program to calibrate *
* the board. Otherwise you can see how much is the offset *
* and you can compensate it through software value *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <drivers/pci6025e/dac.h>
 
#define TASK_VOLT_PERIOD 150E3
#define TASK_VOLT_WCET 080E3
#define TASK_DAC_PERIOD 050E3
#define TASK_DAC_WCET 020E3
 
#define CONV 10/2048
 
#define TASK_GROUP 1
 
WORD dac0_value = 0,
dac1_value = 0;
 
BYTE sys = 0;
BYTE dac = 0;
 
//some colors
int black = rgb16(0, 0, 0),
white = rgb16(255, 255, 255);
 
void drawInterface(void);
void endfun(KEY_EVT *);
void inc(KEY_EVT *);
void dec(KEY_EVT *);
void change_dac(KEY_EVT *);
void close_event(void *);
TASK Voltage_body(int);
TASK DAC_Check_body(int);
 
int main(int argc, char **argv)
{
int modenum;
KEY_EVT k;
HARD_TASK_MODEL m, d;
PID pid_m, pid_d;
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
keyb_set_map(itaMap);
k.flag = CNTR_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
 
k.flag = CNTL_BIT;
keyb_hook(k, endfun);
 
k.flag = 0;
k.scan = 78;
k.ascii = 43;
keyb_hook(k, inc);
 
k.flag = 0;
k.scan = 74;
k.ascii = 45;
keyb_hook(k, dec);
 
k.flag = 0;
k.scan = KEY_V;
k.ascii = 'v';
keyb_hook(k, change_dac);
 
hard_task_default_model(m);
hard_task_def_wcet(m, TASK_VOLT_WCET);
hard_task_def_mit(m, TASK_VOLT_PERIOD);
hard_task_def_group(m, TASK_GROUP);
pid_m = task_create("Voltage", Voltage_body, &m, NULL);
if(pid_m == NIL){
sys = 30;
sys_end();
}
 
hard_task_default_model(d);
hard_task_def_wcet(d, TASK_DAC_WCET);
hard_task_def_mit(d, TASK_DAC_PERIOD);
hard_task_def_group(d, TASK_GROUP);
pid_d = task_create("DAC Check", DAC_Check_body, &d, NULL);
if(pid_d == NIL){
sys = 31;
sys_end();
}
 
//Check if PCI bus is present
if(pci_init()==-1){
sys = 10;
sys_end();
}
//Check if a NI board is on PCI bus
if(!reMap()){
sys = 11;
sys_end();
}
 
if(grx_init()==-1){
sys = 20;
sys_end();
}
 
modenum = grx_getmode(800, 600, 16);
if(modenum == -1){
sys = 21;
sys_end();
}
grx_setmode(modenum);
 
drawInterface();
 
//Analog output section set up
DAC_Init();
 
/*
*AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode
*TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low
*TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode
*UPDATE signal timebase = AO_UPDATE pulse width
*UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period
*UPDATE signal polarity = HIGH Z
*/
DAC_boardInit(0x02, 0x4000);
/*
*LDAC0 source = UPDATE
*DAC0 update immediately
*LDAC1 source = UPDATE
*DAC1 update immediately
*/
DAC_LDACSourceUpdate(0x00);
//End of Analog output section setup
 
group_activate(TASK_GROUP);
 
return 0;
}
 
/*
* Every time operator select a new value to send to a DAc this TASK makes
* actions needed to perform the operation
*/
TASK Voltage_body(int dac_work)
{
WORD old0_value, old1_value;
char buf[6];
float volt;
 
old0_value = dac0_value;
old1_value = dac1_value;
while(1){
if(dac){
if(dac1_value != old1_value){
DAC_output(DAC1, dac1_value);
old1_value = dac1_value;
sprintf(buf, "%04d", dac1_value);
grx_text(buf, 70, 120, rgb16(180, 0, 0), rgb16(255,255,140));
sprintf(buf, "%04x", dac1_value);
grx_text(buf, 300, 120, rgb16(180, 0, 0), rgb16(255,255,140));
if( (dac1_value & 0x0800) == 0 )
volt = (float)dac1_value * (float)CONV;
else
volt = (float)(dac1_value-0x0FFF) * (float)CONV;
sprintf(buf, "%05.2f", volt);
grx_text(buf, 70, 177, rgb16(180, 40, 180), black);
}
} else {
if(dac0_value != old0_value){
DAC_output(DAC0, dac0_value);
old0_value = dac0_value;
sprintf(buf, "%04d", dac0_value);
grx_text(buf, 521, 120, rgb16(180, 0, 0), rgb16(255,255,140));
sprintf(buf, "%04x", dac0_value);
grx_text(buf, 754, 120, rgb16(180, 0, 0), rgb16(255,255,140));
if( (dac0_value & 0x0800) == 0 )
volt = (float)dac0_value * (float)CONV;
else
volt = (float)(dac0_value-0x0FFF) * (float)CONV;
sprintf(buf, "%05.2f", volt);
grx_text(buf, 521, 177, rgb16(180, 40, 180), black);
}
}
task_endcycle();
}
}
 
/*
* This TASK show which is the DAC active
*/
TASK DAC_Check_body(int dummy)
{
BYTE old = dac;
char buf[8];
 
while(1){
if(dac != old){
old = dac;
sprintf(buf, "DAC %d", dac);
grx_text(buf, 385, 90, rgb16(255*dac, 255*(1-dac), 0), black);
}
task_endcycle();
}
}
 
void drawInterface(void)
{
grx_rect(1, 1, 799, 69, rgb16(105, 0, 0));
grx_rect(2, 2, 798, 68, rgb16(155, 0, 0));
grx_rect(3, 3, 797, 67, rgb16(205, 0, 0));
grx_rect(4, 4, 796, 66, rgb16(255, 0, 0));
 
grx_text("Test program for Analog output section of PCI6025E",
7, 10, rgb16(50, 255, 50), black);
grx_text("Use '+' and '-' on numeric pad to change tension",
7, 25, rgb16(0, 255, 255), black);
grx_text("Connect a tester to DAC1 output (pin21) or to DAC0 output (pin20)",
7, 33, rgb16(0, 255, 255), black);
grx_text("Use 'v' to alternate change active DAC",
7, 40, rgb16(0, 255, 255), black);
 
grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
 
grx_rect(1, 80, 355, 150, rgb16(0, 105, 0));
grx_rect(2, 81, 354, 149, rgb16(0, 155, 0));
grx_rect(3, 82, 353, 148, rgb16(0, 205, 0));
grx_rect(4, 83, 352, 147, rgb16(0, 255, 0));
 
grx_rect(1, 160, 355, 199, rgb16(0, 105, 0));
grx_rect(2, 161, 354, 198, rgb16(0, 155, 0));
grx_rect(3, 162, 353, 197, rgb16(0, 205, 0));
grx_rect(4, 163, 352, 196, rgb16(0, 255, 0));
 
grx_rect(455, 80, 799, 150, rgb16(105, 105, 0));
grx_rect(456, 81, 798, 149, rgb16(155, 155, 0));
grx_rect(457, 82, 797, 148, rgb16(205, 205, 0));
grx_rect(458, 83, 796, 147, rgb16(255, 255, 0));
 
grx_rect(455, 160, 799, 199, rgb16(105, 105, 0));
grx_rect(456, 161, 798, 198, rgb16(155, 155, 0));
grx_rect(457, 162, 797, 197, rgb16(205, 205, 0));
grx_rect(458, 163, 796, 196, rgb16(255, 255, 0));
 
grx_rect(360, 80, 450, 105, rgb16(85, 85, 255));
grx_rect(361, 81, 449, 104, rgb16(125, 125, 255));
grx_rect(362, 82, 448, 103, rgb16(175, 175, 255));
grx_rect(363, 83, 447, 102, rgb16(225, 225, 255));
 
grx_rect(153, 93, 195, 103, rgb16(255, 0, 0));
grx_text("DAC 1", 155, 95, rgb16(255, 170, 170), black);
 
grx_rect(607, 93, 649, 103, rgb16(255, 0, 0));
grx_text("DAC 0", 609, 95, rgb16(255, 255, 210), black);
 
grx_text("Decimal", 7, 120, rgb16(120, 120, 255), black);
grx_text("Hexadecimal", 200, 120, rgb16(120, 120, 255), black);
grx_text("Tension", 7, 177, rgb16(120, 120, 255), black);
 
grx_text("Decimal", 461, 120, rgb16(255, 120, 120), black);
grx_text("Hexadecimal", 654, 120, rgb16(255, 120, 120), black);
grx_text("Tension", 461, 177, rgb16(255, 120, 120), black);
}
 
void close_event(void *arg)
{
grx_close();
switch(sys){
case 0 : cprintf("Regular End\n"); break;
case 1 : cprintf("End fun invoked\n"); break;
case 10: cprintf("Pci bus not found\n"); break;
case 11: cprintf("No National board found\n"); break;
case 20: cprintf("Cannot initialize graphic envirorment\n"); break;
case 21: cprintf("Cannot start envirorment in 800x600x16\n"); break;
case 30: cprintf("Cannot create task <voltage>\n"); break;
case 31: cprintf("Canot create task <DAC Check>\n"); break;
case 40: cprintf("Break on clock end event\n"); break;
default: cprintf("Unkwon exit event\n"); break;
}
}
 
void endfun(KEY_EVT *k)
{
sys = 1;
sys_end();
}
 
/*
* Capture correct key event and increase output tension of active DAC
*/
void inc(KEY_EVT *k)
{
if(dac){
if( (dac1_value & 0x0800) == 0 && dac1_value > 0x07FF )
dac1_value = 0;
else
dac1_value++;
} else {
if( (dac0_value & 0x0800) == 0 && dac0_value > 0x07FF )
dac0_value = 0;
else
dac0_value++;
}
}
 
/*
* Same as above but decrease tension
*/
void dec(KEY_EVT *k)
{
if(dac){
if(dac1_value < 1)
dac1_value = 0x0FFF;
else
dac1_value -= 1;
} else {
if(dac0_value < 1)
dac0_value = 0x0FFF;
else
dac0_value -= 1;
}
}
 
/*
* Capture correct key event and change active DAC
*/
void change_dac(KEY_EVT *k)
{
if(dac) dac = 0;
else dac = 1;
}
 
/demos/branches/pj/pci6025e/test_ppi.c
0,0 → 1,190
/*****************************************************************************
* Filename: Test_ppi.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 22/05/2001 *
* Description: Test PPI82C55MSM on NI DAQ PCI6025E *
*----------------------------------------------------------------------------*
* Notes: Configures port A and port C in input and port B in output *
* Test 1: *
* Now connect port B to port A and watch on video value changes *
* in counting order. After connect port B to port C and watch *
* the same events on port C *
* Test 2: *
* Connect 8 LEDs on port B and port A and port C lines to Vcc or*
* GND. Now run this test and watch 8 diode changing in counting *
* mode and on screen port A and port C values displayed *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
 
#include <drivers/keyb.h>
#include <drivers/glib.h>
#include <drivers/pci6025e/dio_ppi.h>
 
void exit_fun(KEY_EVT *);
TASK test_ppi(int);
void close_event(void *);
void draw_screen(void);
 
BYTE system = 0;
 
int main(int argc, char **argv)
{
HARD_TASK_MODEL m;
KEY_EVT k;
PID pid_m;
int modenum;
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
keyb_set_map(itaMap);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, exit_fun);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, exit_fun);
 
hard_task_default_model(m);
hard_task_def_wcet(m, 90000);
hard_task_def_mit(m, 250000);
pid_m = task_create("TEST PPI", test_ppi, &m, NULL);
if(pid_m == NIL){
system = 10;
sys_end();
}
 
//Check if PCI bus is present
if(pci_init() == -1){
system = 20;
sys_end();
}
//Look for a National board on PCI bus
if(!reMap()){
system = 21;
sys_end();
}
 
//Start configuring DIO module
PPI_init();
 
grx_init();
modenum = grx_getmode(640, 480, 16);
if(modenum == -1){
system = 30;
sys_end();
}
grx_setmode(modenum);
 
draw_screen();
 
task_activate(pid_m);
 
return 0;
}
 
void draw_screen(void)
{
grx_rect(5, 5, 610, 130, rgb16(255, 0, 0));
grx_rect(4, 4, 611, 131, rgb16(0,255,255));
grx_rect(3, 3, 612, 132, rgb16(255, 0, 0));
grx_rect(15, 45, 195, 100, rgb16(255, 0, 0));
grx_rect(215, 45, 395, 100, rgb16(0, 255, 0));
grx_rect(415, 45, 595, 100, rgb16(200, 200, 255));
grx_text("Test of PPI82C55MSM function (Hosted on PCI6025E)",
9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0));
grx_text("PORT A and PORT C are configured in input mode",
9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0));
grx_text("PORT B is configured in output mode",
9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0));
grx_text("PORT B (Output)", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0));
grx_text("PORT A (Input)", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0));
grx_text("PORT C (Input)", 435, 50, rgb16(200,200,255), rgb16(0, 0, 0));
grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0));
}
 
/*
* At each activation this task sends out value on port B and reads values from
* port A and C
*/
TASK test_ppi(int dummy)
{
BYTE val, pA, pC;
int i;
char buf[10];
 
PPI_config(0x99); //Mode 0 for all; Port A, Port C input; Port B output
val = 0;
while(1){
PPI_write(PPI_PORT_B, val); //sends out value
pA = PPI_read(PPI_PORT_A); //reads from port A
pC = PPI_read(PPI_PORT_C); //reads from port C
 
for(i=7; i>=0; i--){
if( (val>>i)%2 )
grx_text("1", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0));
else
grx_text("0", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0));
if( (pA>>i)%2 )
grx_text("1", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0));
else
grx_text("0", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0));
if( (pC>>i)%2 )
grx_text("1", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0));
else
grx_text("0", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0));
}
sprintf(buf, "%03d", val);
grx_text(buf, 140, 75, rgb16(255,0,0), rgb16(0,0,0));
sprintf(buf, "%03d", pA);
grx_text(buf, 340, 75, rgb16(0,255,0), rgb16(0,0,0));
sprintf(buf, "%03d", pC);
grx_text(buf, 540, 75, rgb16(200,200,255), rgb16(0,0,0));
val++;
task_endcycle();
}
}
 
void close_event(void *arg)
{
grx_close();
switch(system){
case 0: kern_printf("Regular end\n"); break;
case 10:kern_printf("Cannot create task 'TEST PPI'\n"); break;
case 20:kern_printf("Pci bus don't find\n"); break;
case 21:kern_printf("No National board on PC\n"); break;
case 30:kern_printf("Cannot start graphic envirorment\n"); break;
default: kern_printf("Unknown exit\n"); break;
}
}
 
void exit_fun(KEY_EVT *k)
{
system = 0;
sys_end();
}
 
/*end of file: test_ppi.c*/
/demos/branches/pj/pci6025e/test_bec.c
0,0 → 1,336
/*****************************************************************************
* Filename: test_bec.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 20/06/2001 *
* Description: Test program for buffered gated event counting using PCI6025E *
* board *
*----------------------------------------------------------------------------*
* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could *
* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting *
* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for *
* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 *
* are als configured to switch between 0 and 5 V. Connect DIO 7 to *
* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) *
* to change DIO lines value. On left area of the screen you should *
* see counter while counting and on the right area you should lock *
* counter values by pressing 's' key. *
* Notice that line parameters are enabled and accept inital value *
* for the two counters. If they aren't specified or they are wrong *
* counters start from 0x00FFFFFF (counter 0 which counts down) and *
* 0x00000000 (counter 1 which counts up). *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
#include <drivers/pci6025e/timer.h>
#include <drivers/pci6025e/dio_ppi.h>
 
BYTE sys = 0;
 
PID show_aper_pid;
BYTE out = 0x00;
 
int black = rgb16(0, 0, 0),
white = rgb16(255, 255, 255);
 
void endfun(KEY_EVT *);
void close_event(void *);
void show_evt(KEY_EVT *k);
void gate_change(KEY_EVT *k);
 
void drawInterface(void);
 
TASK show_per(int);
TASK show_aper(int);
 
int main(int argc, char **argv)
{
KEY_EVT k;
SOFT_TASK_MODEL show_per_mod, show_aper_mod;
PID show_per_pid;
int result, modenum;
DWORD init_val_c0, init_val_c1;
 
if(argc >= 3){
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
init_val_c0 = 0x00FFFFFF;
if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1)
init_val_c1 = 0x00000000;
}
if(argc == 2){
if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
init_val_c0 = 0x00FFFFFF;
init_val_c1 = 0x00000000;
}
if(argc == 1){
init_val_c0 = 0x00FFFFFF;
init_val_c1 = 0x00000000;
}
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
k.flag = CNTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
 
k.flag = CNTR_BIT;
keyb_hook(k, endfun);
 
soft_task_default_model(show_aper_mod);
soft_task_def_aperiodic(show_aper_mod);
soft_task_def_level(show_aper_mod, 1);
soft_task_def_period(show_aper_mod, 250000);
soft_task_def_met(show_aper_mod, 30000);
soft_task_def_wcet(show_aper_mod, 60000);
if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){
sys = 10;
sys_end();
}
 
k.flag = 0;
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, show_evt);
 
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
keyb_hook(k, gate_change);
 
k.scan = KEY_H;
k.ascii = 'h';
keyb_hook(k, gate_change);
 
soft_task_default_model(show_per_mod);
soft_task_def_level(show_per_mod, 1);
soft_task_def_met(show_per_mod, 1000);
soft_task_def_period(show_per_mod, 10000);
if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){
sys = 11;
sys_end();
}
 
if(pci_init()==-1){
sys = 20;
sys_end();
}
 
if(!reMap()){
sys = 21;
sys_end();
}
 
if(grx_init()==-1){
sys = 30;
sys_end();
}
 
if( (modenum = grx_getmode(800, 600, 16)) == -1){
sys = 31;
sys_end();
}
 
grx_setmode(modenum);
 
drawInterface();
 
DIO_init();
DIO_setup(0xFF);
DIO_write(out);
 
PFIprogramming(0x0000);
setIntClock(1, 1, 0);
TIM_reset(2); //Reset both two counters
 
 
//Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge;
TIM_bufferedEventCounting(C0, 0x04, 0x45, 0x01, init_val_c0);
 
//Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge;
TIM_bufferedEventCounting(C1, 0x87, 0x46, 0x00, init_val_c1);
 
TIM_arm(2); //Arm both two counters
 
task_activate(show_per_pid);
 
return 0;
}
 
void drawInterface(void)
{
grx_rect(1, 1, 799, 99, rgb16(105, 0, 0));
grx_rect(2, 2, 798, 98, rgb16(155, 0, 0));
grx_rect(3, 3, 797, 97, rgb16(205, 0, 0));
grx_rect(4, 4, 796, 96, rgb16(255, 0, 0));
 
grx_text("Test program for Buffered Event Counting capacity of PCI6025E timers",
7, 10, rgb16(50, 255, 50), black);
 
grx_text("This program counting rise edges on counters source (PFI3 & PFI6)",
7, 18, rgb16(0, 255, 255), black);
grx_text("Counter 1 will be resetted every gate falling edge",
7, 26, rgb16(0, 255, 255), black);
grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz",
7, 34, rgb16(0, 255, 255), black);
 
grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black);
grx_text("Use 's' to watch contents of Hardware save registers updated every time gate goes down",
7, 51, rgb16(0, 255, 255), black);
grx_text("Use 'g' to generate an event on counter 0 gate (see top-left square)",
7, 58, rgb16(0, 255, 255), black);
 
grx_text("Use 'h' to generate an event on counter 1 gate (see bottom-left square)",
7, 65, rgb16(0, 255, 255), black);
 
grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
7, 78, rgb16(0, 255, 0), black);
grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black);
 
grx_rect(1, 110, 355, 170, rgb16(0, 105, 0));
grx_rect(2, 111, 354, 169, rgb16(0, 155, 0));
grx_rect(3, 112, 353, 168, rgb16(0, 205, 0));
grx_rect(4, 113, 352, 167, rgb16(0, 255, 0));
grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black);
 
grx_rect(455, 110, 799, 170, rgb16(0, 105, 0));
grx_rect(456, 111, 798, 169, rgb16(0, 155, 0));
grx_rect(457, 112, 797, 168, rgb16(0, 205, 0));
grx_rect(458, 113, 796, 167, rgb16(0, 255, 0));
grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black);
 
grx_rect(360, 110, 450, 170, rgb16(0, 105, 0));
grx_rect(361, 111, 449, 169, rgb16(0, 155, 0));
grx_rect(362, 112, 448, 168, rgb16(0, 205, 0));
grx_rect(363, 113, 447, 167, rgb16(0, 255, 0));
grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black);
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
 
grx_rect(1, 190, 355, 260, rgb16(85, 85, 255));
grx_rect(2, 191, 354, 259, rgb16(135, 135, 255));
grx_rect(3, 192, 353, 258, rgb16(190, 190, 255));
grx_rect(4, 193, 352, 257, rgb16(230, 239, 255));
grx_text("Counter 1 evolution", 7, 200, white, black);
 
grx_rect(455, 190, 799, 260, rgb16(85, 85, 255));
grx_rect(456, 191, 798, 259, rgb16(135, 135, 255));
grx_rect(457, 192, 797, 258, rgb16(190, 190, 255));
grx_rect(458, 193, 796, 257, rgb16(230, 230, 255));
grx_text("Counter 1 locked value", 461, 200, white, black);
 
grx_rect(360, 190, 450, 260, rgb16(85, 85, 255));
grx_rect(361, 191, 449, 259, rgb16(135, 135, 255));
grx_rect(362, 192, 448, 258, rgb16(190, 190, 255));
grx_rect(363, 193, 447, 257, rgb16(230, 230, 255));
grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black);
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
}
 
TASK show_per(int none)
{
DWORD val;
char buf[30];
 
while(1){
val = TIM_readCounter(C0); //Read from Hardware Save Register
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
grx_text(buf, 7, 145, rgb16(255, 0, 0), black);
 
val = TIM_readCounter(C1); //Read from Hardware Save Register
sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
grx_text(buf, 7, 225, rgb16(255, 0, 0), black);
 
task_endcycle();
}
}
 
TASK show_aper(int dummy)
{
DWORD val;
char buf[30];
 
while(1){
val = TIM_readHWSaveReg(C0); //Read from Hardware Save Register
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
grx_text(buf, 461, 145, rgb16(80, 80, 255), black);
 
val = TIM_readHWSaveReg(C1); //Read from Hardware Save Register
sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
grx_text(buf, 461, 225, rgb16(80, 80, 255), black);
 
task_endcycle();
}
}
 
void endfun(KEY_EVT *k)
{
sys_end();
}
 
void show_evt(KEY_EVT *k)
{
task_activate(show_aper_pid);
}
 
void gate_change(KEY_EVT *k)
{
if(k->ascii == 'g'){
if( (out & 0x80) != 0){
out &= 0x7F;
grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
} else {
out |= 0x80;
grx_text("5 V", 367, 145, rgb16(0, 255, 0), black);
}
} else {
if( (out & 0x40) != 0){
out &= 0xBF;
grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
} else {
out |= 0x40;
grx_text("5 V", 367, 225, rgb16(0, 255, 0), black);
}
}
 
DIO_write(out);
}
 
void close_event(void *arg)
{
TIM_disarm(2); //Disable both two counters
grx_close();
 
switch(sys){
case 0: cprintf("OK\n"); break;
case 10: cprintf("Task <show aperiodic> down\n"); break;
case 11: cprintf("Task <show periodic> down\n"); break;
case 20: cprintf("No PCI bus\n"); break;
case 21: cprintf("No National board on PCI bus\n"); break;
case 30: cprintf("No graphic can be initialized\n"); break;
case 31: cprintf("This graphic mode cannot be supported\n"); break;
default: cprintf("???????????\n"); break;
}
}
/* End of file: Test_bec.c */
/demos/branches/pj/pci6025e/test_dio.c
0,0 → 1,184
/*****************************************************************************
* Filename: Test_dio.c *
* Author: Marco Ziglioli (Doctor Stein) *
* Date: 22/03/2001 *
* Last update: 22/03/2001 *
* Description: Test STC digital lines (8 lines) *
*----------------------------------------------------------------------------*
* Notes: Configure DIO 4 5 6 7 in input and DIO 0 1 2 3 in output *
* Two way to test this 8 lines: *
* 1) Connect 4 LEDs to output lines and check LEDs lights *
* themselves in counting order. Connect input lines to Vcc *
* or GND and check on video that STC has readed the right *
* nibble *
* 2) Connect 4 output lines with 4 input lines and check on *
* video that the nibble readed by STC change in counting *
* order *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2001 Marco Ziglioli
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <drivers/pci6025e/dio_ppi.h>
 
BYTE system = 0;
 
void close_event(void *);
TASK test_DIO(int dummy);
void exit_fun(KEY_EVT *);
void draw_screen(void);
 
 
int main(int argc, char **argv)
{
HARD_TASK_MODEL m;
KEY_EVT k;
PID pid_m;
int modenum;
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
keyb_set_map(itaMap);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, exit_fun);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, exit_fun);
 
hard_task_default_model(m);
hard_task_def_wcet(m, 90000);
hard_task_def_mit(m, 250000);
pid_m = task_create("TEST DIO", test_DIO, &m, NULL);
if(pid_m == NIL){
system = 10;
sys_end();
}
 
//Check if PCI bus is present
if(pci_init() == -1){
system = 20;
sys_end();
}
 
//Look for a National board on PCI bus
if(!reMap()){
system = 21;
sys_end();
}
 
//Start configuring DIO module
DIO_init();
 
grx_init();
modenum = grx_getmode(640, 480, 16);
if(modenum == -1){
system = 30;
sys_end();
}
grx_setmode(modenum);
 
draw_screen();
 
task_activate(pid_m);
 
return 0;
}
 
void draw_screen(void)
{
grx_rect(5, 5, 405, 130, rgb16(255, 0, 0));
grx_rect(4, 4, 406, 131, rgb16(0,255,255));
grx_rect(3, 3, 407, 132, rgb16(255, 0, 0));
grx_rect(15, 45, 195, 100, rgb16(255, 0, 0));
grx_rect(215, 45, 395, 100, rgb16(0, 255, 0));
grx_text("Test of PCI6025E DIO function",
9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0));
grx_text("DIO 4-5-6-7 are configured in input mode",
9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0));
grx_text("DIO 0-1-2-3 are configured in output mode",
9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0));
grx_text("Output bits", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0));
grx_text("input bits", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0));
grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0));
}
 
/*
* At each activation this task change output value of lowest digitals line
* and read value on highest digital lines, showing them at video
*/
TASK test_DIO(int dummy)
{
BYTE out_val = 0x00,
in_val = 0;
int i;
char buf[10];
 
//DIO 0..3 configured as output
//DIO 4..7 configured as input
DIO_setup(0x0F);
 
while(1){
DIO_write(out_val); //sends out value
in_val = DIO_read() >> 4; //reads value
 
for(i=3; i>=0; i--){
if( (out_val>>i)%2 )
grx_text("1", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0));
else
grx_text("0", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0));
if( (in_val>>i)%2 )
grx_text("1", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0));
else
grx_text("0", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0));
}
sprintf(buf, "%03d", out_val);
grx_text(buf, 80, 75, rgb16(255,0,0), rgb16(0,0,0));
sprintf(buf, "%03d", in_val);
grx_text(buf, 280, 75, rgb16(0,255,0), rgb16(0,0,0));
 
out_val = (out_val+1)%16;
task_endcycle();
}
}
 
void close_event(void *arg)
{
grx_close();
switch(system){
case 0: kern_printf("Regular end\n"); break;
case 10:kern_printf("Cannot create task TEST DIO\n"); break;
case 20:kern_printf("Pci bus don't find\n"); break;
case 21:kern_printf("No National board on PC\n"); break;
case 30:kern_printf("Cannot start graphic envirorment\n"); break;
default: kern_printf("Unknown exit\n"); break;
}
}
 
void exit_fun(KEY_EVT *k)
{
system = 0;
sys_end();
}
 
/demos/branches/pj/pci6025e/makefile
0,0 → 1,32
#
#
# PCI6025E Examples and Test programs
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= test_dac wave test_dio test_ppi test_ec test_bec test_mes test_bms
 
include $(BASE)/config/example.mk
 
test_dac:
make -f $(SUBMAKE) APP=test_dac INIT= OTHEROBJS=initfile.o
wave:
make -f $(SUBMAKE) APP=wave INIT= OTHEROBJS=initfile.o
test_dio:
make -f $(SUBMAKE) APP=test_dio INIT= OTHEROBJS=initfile.o
test_ppi:
make -f $(SUBMAKE) APP=test_ppi INIT= OTHEROBJS=initfile.o
test_ec:
make -f $(SUBMAKE) APP=test_ec INIT= OTHEROBJS=initfile.o
test_bec:
make -f $(SUBMAKE) APP=test_bec INIT= OTHEROBJS=initfile.o
test_mes:
make -f $(SUBMAKE) APP=test_mes INIT= OTHEROBJS=initfile.o
test_bms:
make -f $(SUBMAKE) APP=test_bms INIT= OTHEROBJS=initfile.o
 
/demos/branches/pj/pci6025e/readme
0,0 → 1,7
These are the demos available for the National Instruments PCI6025e boards.
 
These demos and the PCI driver have been made by
Marco Ziglioli (zi_mar@libero.it). Please send any comments to:
zi_mar@libero.it or to shark-help@gandalf.sssup.it.
 
Paolo
/demos/branches/pj/pse51/ptest1
0,0 → 1,426
+vìƒì h1#èŸæƒÄjjèWXƒÄƒì jèb=ƒÄ=vìƒì h@1#èoæƒÄjh,jjèÀZƒÄƒì jè*=ƒÄ=ÿ4 vìƒì h2#è7æƒÄÿuÔèTOÇ$/2#è 渃ÄÉÉöU‰åƒìhà.#èæEü‰$è…kƒÄjEüPèŸkƒÄEøPEüPèClƒÄ ÿuøPh/#èÊ布ÄÉÃU‰åƒì4h@/#è°åEä‰$è1kƒÄjEäPèKkƒÄEèPEäPè7lƒÄÿuðÿuìÿuèPh€/#èpå¸ƒÄ ÉÉöU‰åƒì4hÀ/#èTåEä‰$èÕjƒÄjEäPèïjÇE؍EØÇ@£áƒÄ PEèPEäPèákƒÄÿuðÿuìÿuèPh0#èå¸ƒÄ ÉÃU‰åƒìh@0#èèäƒÄÉÍvU‰åVSƒì<h€0#èÎäEԉ$èOjƒÄjEÔPèijÇEÈ
+uÈÇFÇEØÐ"ÇEÜÇ$èª=‰Ã‹‰EàE؉ƒÄ VEèPEÔPè5k‹Uà‰ƒÄÿuðÿuìÿuèPhÀ0#èQä¸ƒÄ eø[^]ÉöU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾ü[#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
+è֜E¨‰$ècƒÄ…Àyƒì h@2#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€= ]#„¶€ú*t€úªt
+]#éTþÿÿv€út€ú¸uÆ]#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+]#t¶Âf¾€ ˆ#·Àë-v€=]#t¶Âf¾€Àˆ#·Àëv¶Âf¾€€‡#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  ]#ƒÈ@ë‰ö ]#ˆE؈UيE׈EÚ±»;x‡#}8¾‡#v݊D2:EÚuŠ2:EØuƒì Wÿ’‡#±ƒÄC;x‡#|ЄÉuƒìjW¿B‰#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£]#Šˆ‚‡#ŠPˆƒ‡#ŠPˆ„‡#ŠPˆ…‡#ŠPˆ†‡#ŠPˆ‡‡#ŠPˆˆ‡#ŠPˆ‰‡#ŠPˆŠ‡#ŠP ˆ‹‡#ŠP
+ˆ%ˆ#ŠPˆ&ˆ#ŠPˆ'ˆ#ŠPˆ(ˆ#ŠPˆ)ˆ#ŠPˆ*ˆ#ŠPˆ+ˆ#ŠPˆŒ‡#ŠPˆ,ˆ#ŠPˆ‡#ŠPˆ-ˆ#ŠPˆš‡#ŠPˆ:ˆ#ŠPˆ›‡#ŠPˆ;ˆ#ŠPˆ§‡#ŠPˆGˆ#ŠPˆ¨‡#ŠPˆHˆ#ŠP ˆ©‡#ŠP!ˆIˆ#ŠP"ˆµ‡#ŠP#ˆUˆ#ŠP$ˆ³‡#ŠP%ˆSˆ#ŠP&ˆ´‡#ŠP'ˆTˆ#ŠP(ˆ«‡#ŠP)ˆKˆ#ŠP*ˆ¹‡#ŠP+ˆYˆ#ŠP,ˆŽ‡#ŠP-ˆ.ˆ#ŠP.ˆ‡#ŠÖˆ/ˆ#ŠP0ˆ‡#ŠP1ˆ!ˆ#ŠP2ˆœ‡#ŠP3ˆ<ˆ#ŠP4ˆ„ˆ#ŠP5ˆoˆ#ŠP6ˆpˆ#ŠP7ˆqˆ#ŠP8ˆkˆ#ŠP9ˆlˆ#ŠP:ˆmˆ#ŠP;ˆgˆ#ŠP<ˆhˆ#ŠP=ˆiˆ#ŠP>ˆrˆ#ŠP?ˆsˆ#ŠP@ˆ·#ŠPAˆ·‡#ŠPBˆµ‡#ŠPCˆʇ#ŠPDˆnˆ#ŠPEˆWˆ#ŠPFˆjˆ#ŠPGˆž‡#ŠPHˆ>ˆ#ŠPIˆ°‡#ŠPJˆPˆ#ŠPKˆ®‡#ŠPLˆNˆ#ŠPMˆ ‡#ŠPNˆ@ˆ#ŠPOˆ’‡#ŠPPˆ2ˆ#ŠPQˆ¡‡#ŠPRˆAˆ#ŠPSˆ¢‡#ŠPTˆBˆ#ŠPUˆ£‡#ŠPVˆCˆ#ŠPWˆ—‡#ŠPXˆ7ˆ#ŠPYˆ¤‡#ŠPZˆDˆ#ŠP[ˆ¥‡#ŠPRˆEˆ#ŠP]ˆ¦‡#ŠP^ˆFˆ#ŠP_ˆ²‡#ŠP`ˆRˆ#ŠPaˆ±‡#ŠPbˆQˆ#ŠPcˆ˜‡#ŠPdˆ8ˆ#ŠPeˆ™‡#ŠPfˆ9ˆ#ŠPgˆ‡#ŠPhˆ0ˆ#ŠPiˆ“‡#ŠPjˆ3ˆ#ŠPkˆŸ‡#ŠPlˆ?ˆ#ŠPmˆ”‡#ŠPnˆ4ˆ#ŠPoˆ–‡#ŠPpˆ6ˆ#ŠPqˆ¯‡#ŠPrˆOˆ#ŠPsˆ‘‡#ŠPtˆ1ˆ#ŠPuˆ­‡#ŠPvˆMˆ#ŠPwˆ•‡#ŠPxˆ5ˆ#ŠPyˆ¬‡#ŠPzˆLˆ#ŠP{ˆڈ#ŠP|ˆۈ#ŠP}ˆçˆ#Š@~¢èˆ#]ÍvU‰åWVSƒì\‹]}ؾ ]#ü¹󥿸ƒ=]#…Qº¾€‡#¹ ˆ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇC\#ƒì ÿsèûÿÿÇ$jjjhy2#èϔf£B‰#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhy2#è0˜f£D‰#ƒÄfƒøÿuƒì ¿B‰#P蕛¸ýÿÿÿ頍vÇx‡#ƒ{ÿuÇCx"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+x‡#Í»‡#‹Ef‰ŠE
+x‡#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=]#t9蓃ì ÿ5H‰#è-4¿B‰#‰$è昿D‰#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$h2#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRLè{ ƒÄhŒá#jÿˆ]#ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿèV ¡Œá#@‰ÂÁâ)¿Õhâ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìh$*"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=T]#u(èè
+ƒì ¡Œá#@‰ÂÁâ)¿Õhâ#Pèt­ƒÄÉÍvU‰åWVSƒìhŠ2#è]$ƒÄ»`â#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hâ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾`â#¡P]#‰3@£P]#‹E ‰Dƒìjÿuƒtâ#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+‰ƒ`â#¿dâ#Ç;¾hâ#¡Œá#@‰ÂÁâ)‹DÖ0‰3ºlâ#ǍAP‹]ð‰˜`â#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁÀâ#°Ç8Ç0ǁÁÀǁ`â#Ç9ºۍƒ€ 
+Ç…Äâ#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂhâ#ÿÿÿÿǂlâ#´â#‰0ã#º‹Mðɍ€ ‰ö
+Ç…0ã#Bƒú~ì»ëC;á#sƒì‹Àá#ÿuSÿPƒÄ…Àxß;á#u7‹]ð[‰ÂÁâ)ÂfÇՈâ#ƒìhâ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnždâ#ƒì‹Àá#ÿuÿuðSÿP,ƒÄ…ÀyWfdžˆâ#ƒìhâ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5„á#s0ƒìµ‹ƒ â#WVÿP ƒÄ…Àxۃ싃 â#WÿuðVÿP$ƒÄ;5„á#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õlâ#‰Æ‹UÑâU‰ÐÁà)Ѓ Őâ#@ën‰öƒì ‹UÑâU‰ÐÁà)зŎâ#Pè@‹UÑâU‰ÑÁá)Ñ»lâ#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»`â#·DÓ.ƃì ·GPjÿwVh1"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õhâ#ƒìU‰ÐPjÿˆ]#ƒÄöGu ÿ€á#ëvöGuÿ@â#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅdâ#‹…Àá#ƒx(„èà…À‰€»;„á#svƒì‹ â#VSÿP(ƒÄC;„á#råv‰ÃÁã)ÃÁ㋃dâ#ƒì‹…Àá#VPÿR0fǃˆâ#ƒÄhâ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;„á#svƒì‹ â#VSÿP(ƒÄC;„á#råv‰ÃÁã)ÃÁ㋃dâ#ƒì‹…Àá#VPÿR0fǃˆâ#ƒÄhâ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Œá#@‰ÂÁâ)¾`â#SÿTÖú‰$èn¡Œá#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº`â#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸dâ#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹hâ#‰Mì‹Uä‹
+Œá#I‰ÐÁà)ÐÁà¾`â#fÇD(‹¸dâ#ƒì‹½Àá#‹ á#¸;Œá#•ÀPQWÿS8¡Œá#@‰ÂÁâ)ƒÄöDÖ1„Ü¡ á#;Œá#…Ë¡Dâ#‰EèM行á#@‰ÂÁâ)»lâ#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5Hâ#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Œá#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjh<?"ÿuìÿuèÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jèû7ƒÄ‰œá#¡Dâ#£”á#¡Hâ#£˜á#eô[^_]ÉöU‰åWVSƒìÇð¡%úÿuèD»ƒÄ¿dâ#¾`â#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂlâ#ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀhâ#ǀlâ#‚¤â#Ç@Çǂ¬â#BP‰0Ç8ÇD`DŽÐ‚8å#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀhâ#ǀlâ#ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀhâ#ÿÿÿÿǀlâ#ºۍƒ€ 
+@â#ƒ=@â#uèúÿÿƒìhDâ#jèÒyƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº`â#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)Ðöőâ#tû雉ö;5Œá#uJv‰ÐÁà)л`â#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;X]#}ƒìÝÿ°‘#Vÿ‘#ƒÄ…Àtٍv‰ÐÁà)Ё Őâ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡ á#@‰ÂÁâ)Âf‹Mòf; Ռâ#”Eñ¾¿`â#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Œá#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;X]#}ƒìÝÿ°‘#Vÿ‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡ á#@‰ÂÁâ)¿Õhâ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿`â#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+4”#‰ÊÁâ‹‚¬‘#£4”#‹E‰‚ ‘#‹E ‰‚¤‘#‰ðƒà‰‚¨‘#‰ðƒàƒøtOƒø
+0”#‰ØP¸[^]ÐU‰åƒìƒ=á#uƒì h`3#èŒÇ$謃ġá#P‰á#ÉÐU‰åƒìƒ=„á#uƒì h3#èPÇ$èÌ«ƒÄ¡„á#P‰„á#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèQµÿÿƒÄeô[^_]ÉöU‰å¸¹¬‘#v‰ÂÁâ@‰
+4”#ƒûÿu¸Ç`á#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$@”#èÍӃÄjjhÿÿjhD”#h@”#èøɃÄjjhÿÿÿhh`”#h@”#èØɃÄjjhÿÿÿþhh|”#h@”#è¸ÉƒÄ ƒ}ütƒì‹EüHPÿuøh@”#è‚ȃă}ôtƒìÿuôÿuðh@”#èfȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh@”#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh@”#èÀËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh@”#èºËƒÄ ÉÐU‰åƒì ÿu ÿuh@”#ènЃÄÉÐU‰åƒìÿuh@”#èU΃ÄÉÃU‰åƒìÿuh@”#èU҃ÄÉÃU‰åƒì jÿuh@”#è[ɃÄÉÉöU‰åƒì ÿu ÿuh@”#èЃÄÉÐU‰åƒìh@”#èÎÇ$@”#è(҃ÄÉÍvU‰åWVSƒì} ‹uEðPhÔ3#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;\]#~hƒìWVh ”#蜃Äj
+VèK›ƒÄ»…À•ÃœúX‰Æƒìh ”#‹Eðÿ4…`]#hÙ3#è]™ƒÄ…Ûuƒì h|4#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPhÔ3#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;\]#~JƒìVSh ”#èB›ƒÄj
+S臚ƒÄœúX‰Ãƒìh ”#‹Eôÿ4…`]#hÙ3#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8å#‰U苀<å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8å#|[‰Eäv1‰ÐÁà)ЍÅ;š8å#u ‹Eì;‚<å#|1‰Ï‰ÐÁà)Ћ Ÿâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8å#}«ƒÿÿt‰ÐÁà)ЋU‰Ÿâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лdâ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»hâ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿâ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹lâ#‹°hâ#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»hâ#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»lâ#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŸâ#‰ƒøÿt@‰ÐÁà)ÐÇżâ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õ¼â#[‰ÂÁâ)ÕP‹‰‚hâ#ǂlâ#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Œá#@‰ÂÁâ)4Õ`â#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷ЋÀš#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+Àš#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+¸éӍvú‰ÈÁàö€È˜#uƒ¸À˜#uû魉öv‰ÐÁà)ЍŜâ#ƒùvèÍ©Çë
+‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁ÆÀ˜#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#Àš#…Àt ‹UԉÐPéÃ=¨%ÿu‹MԉÈP¸ 鮉ö‹5¨%vÁ๢%‹‰¨%‹U ‰¢%‹U‰¢%‹U‰ ¢%‹Œá#‰¢%Çÿÿÿÿ‹E Áàºàš#ƒ<ÿu‰4ë>‰ö‹M ‹àš#‰ÁЃ<Å¢%ÿt»¢%
+‹Í 
+èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹¢%‹
+‹u ‰‹‚¢%‰F‹‚ ¢%‰FƒÂ‹
+©t ƒàý‰
+è@Çë¸þÿÿÿ‰ñÓÀ!Àš#ûé vƒì µƒàš#Pèúðÿÿ‰ÇƒÄƒ»àš#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!Àš#Áâ¹¢%‹
+‹] ‰‹‚¢%‰C‹‚ ¢%‰CƒÂ‹
+©t ƒàý‰
+Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRHƒÄhĚ#ÿ5Œá#èÍîÿÿ¡Œá#@‰ÂÁâ)»`â#fÇDÓ(ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿè Íÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=h›#ÿu
+vÇh›#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µàš#ÿuC‰uèÇEìÇEð¡Œá#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!Àš#降 µºàš#‹[‹Å¢%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!Àš#[Á๢%‹‰U苐¢%‰U싐 ¢%‰Uð‹¢%‰UôP‹
+©tƒàý‰
+ë[¡¨%‰Õ¢%‰¨%ƒìEèPVè
+‰F0‹F8‰Ã÷ЋÀš#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+Àš#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Œá#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Œá#@‰ÂÁâ)¡Àš# ՜â#‰¸]ÉöU‰åSƒì‹E‹U ú‹Œá#‰Œá#Ç€]#jPj jèœìÿÿƒÄÇ€]#‰Œá#û‹]üÉÍvU‰åS‹M‹] ¡„]#ʼnŠ€›#‰š„›#@£„]#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…(œ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹ œ#‹E ‰
+‹E‰‚$œ#ÆD
+ƒìjh\r"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Œá#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸`â#DŽàÿÿÿÿL0ƒìhĚ#Vèõãÿÿ‹ƒdâ#ƒÄ‹…Àá#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇh›#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿˆ]#‹UüRÁ๠œ#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…$œ#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=à£#ÿt ƒ=¨%ÿuûèƒÇ ¸ÿÿÿÿéCv¡à£#‰‹à£#Õ)пäœ#‹DÇ0£à£#‹Õ)йàœ#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅèœ#닍<Å)Ǎ<ýàœ#ü¹ó¥‹Õ)ЍŃºàœ#u#¡¨%‰‚#@Áàƒˆ¢%‹€¢%£¨%‹Õ)ÐÇÅôœ#ÿÿÿÿ‹Õ)ЍÅøœ#Ç@NjÕ)Ѝŝ#Ç@NjÕ)ÐÇÅ #û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<ŝ#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀ#ƒÀºäœ#ƒ<ÿtƒì ÿ4ÿhá#ƒÄÝ)ØÁàƒ¸àœ#uE‹#R Åö¢%u¡¨%‰¢%‰¨%Ý)؋ŝ#@ƒ$Å¢%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸àœ#…‹P ‹‚èœ#@öÅ¢%t¸ìœ#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJìœ#¾èœ#‹7@‹¨%‰Ý¢%£¨%jÿ41ÿ±äœ#jèhçÿÿ‹7@ƒ Å¢%錐‹E´Áà+E´Áà¹àœ#ƒ<uwPƒ<
+tÿ°èœ#ÿ°ìœ#ÿ4
+ƒ¸ìœ#„Àº#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒøœ#‰ƒ#‹Aƒüœ#‰B…Àyÿ‹#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´h(u"ÿ4ŝ#ÿ4ŝ#ÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jè+ùÿÿƒÄ‹E´Áà+E´‰Åôœ#ë‰ö‹E´Áà+E´ÇÅôœ#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<ŝ#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Åôœ#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹øœ#õ)ðÁà‹‰‹D‰Gõ)ðÅºäœ#ƒ<ÿtƒì ÿ4ÿhá#ƒÄ‹Eƒxu
+ƒx „þºøœ#õ)ð ŋ]‹‰
+‹C‰D
+ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<ŝ#uûè܆ǸÿÿÿÿëvÕ)ЋÅ #ûÉÐU‰åWVS¹»äœ#¿àœ#¾ìœ#‰öÍ)ÈÁàÇDÿÿÿÿøœ#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇÜ£#ÿÿÿÿÇà£#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Œá#@‰ÂÁâ)¾`â#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡Œá#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œá#@‰ÂÁâ)¹`â#‹DÑ0Áèƒà‹U ‰¡Œá#@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œá#@‰ÂÁâ)¹`â#‹DÑ0Áè ƒà‹U ‰¡Œá#@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åö‘â#tRQ@»lâ#ƒ<D‹Då#‰ƒìý‰Ø‹Uð‚ðPVè`¥ƒÄ‹Eð˜ðSV艦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…Àá#‰Eð‹Mƒy(…©‹=Œá#‰ÐÁà)Ѝždâ#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йlâ#‹D@‰D@‹„à‰„àƒÂ0¹`â#‹
+%ÿ÷ÿÿ‹\0ã ؉
+9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…Àá#I‰ÐÁà)ЋÅ4å#‹“ðÂPQè?œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…Àá#v‰ÐÁà)Ðfƒ<ňâ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃¤â#PjèR5fǃˆâ#€ƒÄ‹ƒ4å#‹—ðÂPVèðœƒÄeô[^_]ÐU‰åSƒì ‹E‹M ‹…Àá#I‰ÐÁà)ÐÁàfǀˆâ#€‹€4å#‹“ðÂPQ褜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•Àá#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃¤â#Pjè‹4ÿ 7ƒÄ‹ƒ4å#‹Mð‹‘ðÂPÿu 辛fǃˆâ#€ƒÄë‹E @‰ÐÁà)ÐfÇňâ#eô[^_]ÐU‰åƒì‹E‹M ‹…Àá#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇňâ#hâ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…Àá#ƒÀDŽ€R‰ÐÁà)ÐfÇňâ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇňâ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhL"ÿuìÿuèÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ@å#eô[^_]ÐU‰åƒìÿ5Œá#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Œá#jèñãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèÙãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèÁãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè©ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèyãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèaãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèIãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè1ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºdâ#‹‹4…Àá#¿`â#fÇD(€‹„Ћ–ðÂPQèA™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h6#è
+Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µÀá#ƒÄ jh˜5#Sè®[fÇCÆCÇCøŽ"ÇC,"ÇC 8"ÇC$`"ÇC(ÇC,x"ÇC0„"ÇC4Œ"ÇC8˜"ÇC< "ÇC@¼"ÇCDä"ÇCH "ÇCL4"ÇCP\"ÇCT„"ÇCX¬"ÇC\Ԑ"ÇC`‘"ÇCd(‘"ÇChP‘"ÇClx‘"ÇCp ‘"ÇCtȑ"ÇCxð‘"ÇC|’"ǃ€@’"ǃ„h’"ǃˆÿÿÿÿÇ$£5#èô¿ÿÿƒÄ jVh’"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹Àá#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…Àá#ÿ°ˆh5#èìYƒÄÉÍvU‰å‹E‹…Àá#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇՈâ#]ÃU‰åƒìh5#èxYƒÄÿ5Œá#j è„àÿÿƒÄÉÍvU‰åƒìh5#èPYƒÄÿ5Œá#j è\àÿÿƒÄÉÍvU‰åƒìh"5#è(YƒÄÿ5Œá#j è4àÿÿƒÄÉÍvU‰åƒìh)5#èYƒÄÿ5Œá#j è àÿÿƒÄÉÍvU‰åƒìh05#èØXƒÄÿ5Œá#j èäßÿÿƒÄÉÍvU‰åƒìh75#è°XƒÄÿ5Œá#j è¼ßÿÿƒÄÉÍvU‰åƒìh>5#èˆXƒÄÿ5Œá#j è”ßÿÿƒÄÉÍvU‰åƒìhE5#è`XƒÄÿ5Œá#jèlßÿÿ¸ƒÄÉÉöU‰åƒìhL5#è4XƒÄÿ5Œá#jè@ßÿÿƒÄÉÍvU‰åƒìhS5#è XƒÄÿ5Œá#jèßÿÿƒÄÉÍvU‰åƒìhZ5#èäWƒÄÿ5Œá#jèðÞÿÿƒÄÉÍvU‰åƒìha5#è¼WƒÄÿ5Œá#jèÈÞÿÿƒÄÉÍvU‰åƒìhh5#è”WƒÄÿ5Œá#jè ÞÿÿƒÄÉÍvU‰åƒìho5#èlWƒÄÿ5Œá#jèxÞÿÿƒÄÉÍvU‰åƒìhv5#èDWƒÄÿ5Œá#jèPÞÿÿƒÄÉÍvU‰åƒìh}5#èWƒÄÿ5Œá#jè(ÞÿÿƒÄÉÍvU‰åƒìh„5#èôVƒÄÿ5Œá#jèÞÿÿƒÄÉÍvU‰åƒìh‹5#èÌVƒÄÿ5Œá#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh“"h’5#趜ÿÿƒÄ ‹Àá#‰Ã‰šˆƒûÿuƒì hÀ5#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇŘâ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁ຤#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…¤#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹ÐÄ#ƒúÿtqÕ)Ѝ<…w‹†¤#£ÐÄ#ƒì ÿuèV@‰$臹ÿÿ»¤#‰ƒÄÿuPè7U‹Eð‰‡¤#‡ ¤#‰$è0‘ÆDƒÄû‡¤#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»¤#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁ㾤#ÿ43è%¹ÿÿƒÃÆD3¡ÐÄ#‰ƒ¤#‰=ÐÄ#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¤#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Œá#R‰ÑÁá)Ñf‰Íhâ#‹Õ)Ѝ4…¤#ƒ~ ÿu
+¸ÿÿÿÿéìvƒì hàÄ#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å@¨%t0ƒìÿu¿ōƒ ¨%Pè³EƒÄ…Àu€»8¨%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ@¨%ƒìÿuƒ ¨%Pè÷D‹E쉃4¨%ƒÄ€}óu‰Â’‹] f‰ňª%ëv‹E썀‹E ¯Ef‰Ոª%úƒì ‹U썒Áã·ƒˆª%PèݨÿÿºŒª%‰ƒÄû…Àu%è”]ǒƒì hàÄ#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uྀª%‹ƒŒª%‰‚„ª%‰2ƒìjjƒœª%Pè:ûÿÿƒÄ ·D3Pjƒ ª%Pè#ûÿÿƒÄ jjÃ¤ª%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=(°%ÿuèø\ǎûÇEèÿÿÿÿë¡(°%Å)‹•ä¬%‰(°%û‰Eèƒ}èÿu_ƒì hàÄ#èvôÿÿ‹Eèéä‰öè§\ǐƒì hàÄ#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì hàÄ#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹à¬%ŠUòˆT P‹]ì‰
+‹] f‰\
+(°%ûƃ ¨%Ç$àÄ#è
+™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ â#ƒÄ jhØ6#Sè"8fÇCÍÆCÇCÇC²"ÇC \²"ÇC$h²"ÇC(p²"ÇC, ²"ÇC0̲"ÇC4³"ÇC8t¯"ÇC<\³"ÇC@\°"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹… â#ƒì h 6#è7¾ƒÄƒÃƒìÿt³@h¿6#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹… â#ƒÀƒ|@tƒìRj
+9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+Œá#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Œá#‰B‹ƒ¬ÿ@èj€ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹… â#¡Œá#ÿDƒD¡Œá#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ â#ú‹X¸…Û„Ù‹;Œá#uû¸#éčv‹Œá#‹C ;„‘°s
+‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì h7#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4 â#ƒÄ jh7#Vèî1fÇFÌÆFÇFÇF¹"ÇF œ¹"ÇF$ȹ"ÇF(ø¹"ÇF,@º"ÇF0lº"ÇF4ĺ"ÇF8Ô³"ÇF<\µ"ÇF@`¶"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹… â#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ … â#Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹… â#ƒ|³DtƒìVj
+9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh"7#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿à¼%ÿt8CP‰Eä·8Ph)7#èá-ƒÄ ÿt;·D;Ph77#èÊ-ƒÄ ÿt; s·>PhH7#è±-ƒÄ ÿt>·D>PhY7#èš-ƒÄ ‹Uä·D:P·DLPhj7#è~-‹UèÕƒÄ·ØSh{7#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPhÀ7#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰ºÀ?&fƒ=À?&yA¿Áfƒ<Byfù™~îfù™~ƒì h7#èÎ,¸ƒÄé ¿Á<¹À?&‰Úf Ê€f‰Ǎ<ÿÁçºà¼%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇL½%¾A&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹à¼%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽÀ?&]ÉöU‰åSƒì‹]¿E Ph¨7#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhÅ"SèƒÄh¾"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹˜]#€82uºð°îƒìSh9#èˆ*ƒÄÁ㋃˜]#@Ph]C#èp*ƒÄÿ³Ü]#ènƒÄ‹]üÉÉöU‰åƒìÿuh9#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=$»%„à…ÿ„Ø¡ ±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¤±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡ ±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+œ±%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡˜±%‰¡œ±%éqvƒø…綄±%ƒøtƒø…Àt
+ ±%º×®¬]‰È÷êÁú‰ÈÁø)¤±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£ ±%f‰±%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¤±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹ ±%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+¤±%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=”±%…rU衘±%‰¡œ±%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ з𷠻%9Æv%h&9#j_h89#h?9#èm%Ç$èmƒÄ· »%)󯈱%· »%‰Ø‰Ñº÷ñ‰Ãº °
+D^#eø[^]ÍvU‰åWVSº¿L°%¾H°%»D°%¹@°%’ÁàÇ8‰0ÇÇBƒú~ÜÇD^#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…L°%t÷Æu¸ÿÿÿÿëH’ …ǁL°%û…Ût‰™D°%º@°%H°%‰‰t
+€±%‰‹AƒÄ [^_]ÐU‰å‹E¹‹€±%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+;B u‹Eä;B~ÇEÜÇEØëK}؋€±%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡€±%‹@ +EàH‰EØ¡€±%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶„±%ƒøtƒø…Àt
+¤±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ ±%f‰±%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¤±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ ±%f‰±%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡¤±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹€±%‹Mè;J 
+;B u‹Eô;B~ÇEìÇEèëJ]è‹€±%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡€±%‹@ +EðH‰E血±%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼èÔ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡,^#@£,^#1ÛfŒÓü¡”±%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡4^#f9:^#t f£:^#ÿ-6^#ƒ=0^#t‹0^#ÿÓf©f¡ffaωöU‰å‹EØf£:^#f£4^#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;:^#t f£:^#ÿ-6^#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡ø[#]ÉöU‰å]ÍvU‰åSƒì‹ø[#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=ê[#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèê[#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹_#fÇD
+8Ƃ_#îƂ_#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+@^#ë7fƒùw<·Éƒé¸Óà
+A^#¢A^#º¡î<ÿu @^#©uƒÈ¢@^#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"@^#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"A^#¢A^#º¡î @^#©t%û¢@^#º!î]ÉöU‰å¿4^#]ÃU‰åƒì‹Ef£4^#˜PèWüÿÿƒÄÉÐU‰å¿4^#]ÃU‰åƒì‹E‰Âf£4^#ƒ=D^#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹L^#ºŒ^#‰öµÇ€Û"Ç€Û"Fƒþ~åƒì EÈPèÅèºÇ€A&Á9#‹EÈ£„A&¶H^#£ˆA&ƒÄ‹EУA&‹EÔ£”A&‹EØ£˜A&h)Ý"jè£ýÿÿƒÄh3Ý"jè”ýÿÿƒÄh=Ý"jè…ýÿÿƒÄhDÝ"jèvýÿÿƒÄhKÝ"jègýÿÿƒÄhRÝ"jèXýÿÿƒÄhYÝ"jèIýÿÿƒÄhŸÝ"jè:ýÿÿƒÄh`Ý"jè+ýÿÿƒÄhgÝ"j èýÿÿƒÄhnÝ"j
+ô@&€¾ƒÄvÀÅà¼%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿A&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=„A&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•Œ^#]ÉöU‰å‹U‹E ‰•L^#]ÉöU‰åƒìh 9#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃÆH^#Ûã¹âþfÇJ^#ZZÝ=J^#¹âþf¡J^#<u+Ù=J^#¹âþf¡J^#f%?fƒø?uÆH^#ÆH^#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…L^#ÿÓ[° ƒûrº îº îf¡4^#f;:^#t f£:^#ÿ-6^#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=ê[#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…Œ^#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿Ì^#È·À-yƒÀÁø9ÂtU¿Ì^#@ÀÝ4ÅL½%›È·À-yƒÀÁøf£Ì^#¿5Ì^#¿ÀA&4v4ö4õL½%¹üó¥Ý%ÀA&^_]ÉöU‰å¿Ì^#]ÃU‰åWVSƒì(ŠM¡Ð^#Áà ˜€ f¶.B&f£êÔ#f¶-B&f£ìÔ#€ù t%€ù €ù„óé‰ö€ù
+êÔ#·êÔ#·ìÔ#¯0B&ÂÆS fÿêÔ#éõ‰ö·êÔ#·ìÔ#¯0B&Ј CfÿêÔ#·êÔ#;0B&Ž¿fÇêÔ#·ìÔ#¡4B&H9Â…š¡0B&H‰EԉUÐf¾,B&Áâf‰UÚ¡Ð^#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯0B&Èf‹]Úf‰FA;MÔ~çëfÿìÔ#·5êÔ#·=ìÔ#‰øf¯0B&f‰EΡÐ^#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ.B&‰ø¢-B&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯0B&f‰Eò¡Ð^#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢.B&‰úˆ-B&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡Ð^#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯0B&È·G‰ð¯0B&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯0B&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡0B&H‰Eð‹4B&K‰]ìf¾,B&Áàf‰Eê¡Ð^#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯0B&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰0B&¶„@£4B&¶„ÿ ¢,B&¶P¢.B&¶Q¢-B&¶`¢ïÔ#¶a¢îÔ#ÇÔ^#ÇÐ^#]ÃU‰åWVSƒì .B&¢P -B&¢Q¶ÀP¶.B&PèŠýÿÿ¶îÔ#¶5ïÔ#ƒÄ¹Ô°
+‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹Ð^#Áâ»Õ#¶.B&‰¹ Õ#¶-B&‰
+µŠ¢.B&Š
+¢-B&‰5Ð^#[^]ÃU‰å¡Ô^#]ÉöU‰å¡Ð^#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯0B&¡Ð^#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢-B&ŠE¢.B&ƒÄeô[^_]ÍvU‰åWVSƒì ¡0B&H‰Eð‹=4B&Of¾,B&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯0B&¡Ð^#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ-B&Æ.B&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯0B&¡Ð^#Áà ÂU”€ ˆ
+¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+vƒÃ·Sü‰UЃì ÿuÌÿuäj
+ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…Ð)#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… +#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhè9#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhõ9#Wè¶öÿÿ‰ÇƒÄ EìPj
+ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìh:#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèY
+ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(Ý`,#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý`,#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ`,#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý`,#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý`,#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E Ø^#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝh,#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝ8:#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝ8:#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5p,#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+p,#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+ƒìjhî:#é½ ÝØÇEغ;#ƒøc~º;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„à ƒì EØPèð ƒÄ…À…» ƒ=è^#…Ÿ ƒìjh;#é1 ÝØÇEغ;#ƒøc~º;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„7 ƒì EØPèd ƒÄ…À…/ ƒ=è^#… ƒìjh;#é¥ ÝØÇEغ;#ƒøc~º ;#‰U܃=è^#uÇEðàÇEôÿÿïGéP ¡Ü^#‹à^#‰Eð‰Uôé9 ‰öÝØÇEغ;#ƒøc~º ;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=è^#…= ƒìjh(;#éÏ
+vÝØÇEغ<;#ƒøc~º@;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=è^#…¯
+ƒìjhE;#éA
+ÝØÇEغ<;#ƒøc~º@;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=è^#…#
+Ü^#‹à^#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغ¨<#ƒøc~º®<#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=è^#…jé|vÝØÇEغµ<#ƒøcŽ•º¸<#鋍vÝØÇEغW5#ƒøc~uºÔ:#ën‰öÝØÇEغË<#ƒøc~YºÎ<#ëR‰öÝØÇEغ5#ƒøc~=ºê:#ë6‰öÝØÇEغÒ<#ƒøc~!ºÕ<#ë‰öÝØÇEغ;#ƒøc~º;#‰UÜÇEðÇEôƒ=è^#„¯ƒì EØPèʃąÀ…•ƒ=è^#…‹ƒìjÿuÜjè£îÿÿƒÄ jh¼<#jè’îÿÿƒÄëfÝØÇEغ;#ƒøc~º!;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#tƒì EØPè2ƒÄ…À…ýè®íÿÿÇ"éívÝØÇEغ;#ƒøc~º!;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#„‰ƒì EØP趃Ä…À…ƒ=è^#uiƒìjh);#jè‘íÿÿƒÄëSÇEغž;#ƒøc~º¢;#‰UÜÝ]ðƒ=è^#ÿt ƒ=è^#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÀìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUh=#h"=#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`h=#h-=#è` ƒÄöCtƒìjah=#h`=#èC ƒÄöC tƒìjbh=#h =#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnh=#hA=#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlhÐ=#hÛ=#èX ƒÄ‹F ;Cv‹F;C sƒìjmhÐ=#h>#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh->#h5>#èÙ
+ƒÄ…ÿuƒìjMh->#h>>#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh->#h€>#è€
+ƒÄƒ~t‹F;F rƒìjUh->#hà>#è[
+ƒÄ‹F +F9FvƒìjUh->#h ?#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h->#h`?#èø ƒÄöCtƒìj_h->#h ?#èÛ ƒÄƒ;t9wƒìj`h->#hà?#è» ƒÄ;^ rƒìjah->#hV>#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwh->#hm>#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjTh @#h5>#èۃă} uƒìjUh @#h>>#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[h @#h€>#舃ăt‹G;G rƒìj[h @#hà>#ècƒÄ‹G +G9Gvƒìj[h @#h ?#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkh @#h`?#èèƒÄöCtƒìjlh @#h ?#è˃ă;t9wƒìjmh @#hà?#諃Ä;_ rƒìjnh @#hV>#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘h @#h@#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–h @#h@@#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´h @#hm>#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]Shr@#è]Ìÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvhA#è-ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjah„@#h€>#袃ă~t‹F;F rƒìjah„@#hà>#è}ƒÄ‹F +F9Fvƒìjah„@#h ?#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh@A#èËÿÿƒÄ ÷Ãtƒìjih„@#h`?#èƒÄöCtƒìjjh„@#h€A#èóƒÄƒ{wƒìjkh„@#h‹@#èփă;t9wƒìjlh„@#hà?#趃Ä;^ rƒìjmh„@#hV>#蚃Ä{‹…Û…BÿÿÿƒìWh§@#èÜÊÿÿƒÄ9~tƒìjsh„@#hº@#è`ƒÄ‹6…ö…cþÿÿƒì hÒ@#è¦ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh=#h5>#è ƒÄ…ÛuƒìjOh=#h²A#èñƒÄƒ}uƒìjPh=#h>>#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh=#h½A#螃ă{uƒ{t‹C;CsƒìjYh=#h€>#èsƒÄƒ{t‹C;C rƒìjYh=#hà>#èNƒÄ‹C +C9CvƒìjYh=#h ?#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh=#h ?#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh=#hàA#諃ąöt8‹U:9ðr.9ðtƒìjuh=#h B#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]hFB#h€>#蠃ă~t‹F;F rƒìj]hFB#hà>#è{ƒÄ‹F +F9Fvƒìj]hFB#h ?#èYƒÄÿEð¿‹^…Û„¨v÷ÃtƒìjdhFB#h`?#è$ƒÄöCtƒìjehFB#h€A#èƒÄƒ{wƒìjfhFB#h‹@#èêƒÄƒ;t9wƒìjghFB#hà?#èʃÄ;^ rƒìjhhFB#hV>#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnhFB#hº@#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh`B#è¶ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh`Ù#è}ÈÿÿƒÄh`Ù#ÿ5 á#jSVhàB#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Œá#jÿuÿu ÿuh B#èƒÄ ÉÉöU‰åƒì E Pÿuh`Ý#èÈÿÿƒÄ jjhX##èä%ÿÿƒÄh`Ý#hCC#è‚ÅÿÿÇ$Mè>ÿÿƒÄÉÐU‰åƒìh`Ý#h C#è[ÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лdâ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»hâ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿâ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8å#‰U苀<å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8å#|[‰Eäv1‰ÐÁà)ЍÅ;š8å#u ‹Eì;‚<å#|1‰Ï‰ÐÁà)Ћ Ÿâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8å#}«ƒÿÿt‰ÐÁà)ЋU‰Ÿâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜lâ#¿hâ#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»lâ#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õ¸â#‰ƒøÿt@‰ÐÁà)ÐÇżâ#ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Ÿâ#‹@‰ÂÁâ)‰ Õ¼â#됉KI‰ÐÁà)ÐÇŸâ#ÿÿÿÿI‰ÐÁà)ÐÇżâ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰żâ#‹C@‰ÂÁâ)‰ Õ¸â#ë‰ö‰ I‰ÐÁà)ÐÇżâ#ÿÿÿÿI‰ÐÁà)ÐÇŸâ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸aC#됸fC#됸jC#됸pC#됸14#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèD—ÿÿƒÄ ÿuìÿuèh€C#è]ÁÿÿƒÄ÷EtN¾;5á#sA¿Àá#vƒì µ‹;¶BP·BPRVhÀC#èÁÿÿƒÄ‹;VÿP ƒÄF;5á#rÇ÷Etƒì h›C#èíÀÿÿèP&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöì"Èî"Èî"Èî"Èî"Èî"4î"Èî"@î"Lî"Èî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî" ì" ì"Œí"Lí"Ìí"(î" ì"Èî"Èî"î"Èî"(î"Èî"í"Èî"Èî"$í"Èî"lì"Èî"Èî"¸ì"¬ï"Œñ"Œñ"Œñ"Œñ"Œñ"ñ"Œñ"ñ"ñ"Œñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"¸ï"Ìï"Œñ"Œñ"Œñ"øð"Ìï"Œñ"Œñ"ìð"Œñ"øð"Œñ"Œñ"Œñ"Œñ"Äð"Œñ"ð"Œñ"Œñ"`ð"˜ô"¤ô"¤ô"¤ô"¤ô"¤ô"hò"hò"hò"hò"hò"hò"hò"hò"hò"hò"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"˜ò"ó"ô"ô"ô"Œô"ó"¤ô"¤ô"€ô"¤ô"Œô"¤ô"¤ô"¤ô"¤ô"°ò"¤ô"Œó"¤ô"¤ô"¨ó"$@$@#p#Ü#L#œ#ì#<#l#ø#„##œ#( #´ #
+#Œ
+#L#|##Œ## ##„#ð#\#À# #P#t##¬#È#ä#d#Ü#d#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä##p#Ü#L#œ#ì#<#l#ø#„##œ#( #´ #
+#Œ
+#L#|##Œ## ##„#ð#\#À# #P#t##¬#È#ä#d#Ü#d#J1 starts and call sigwait(31)
+J1 exit from sigwait(), err=%d, sig=%d
+J2 starts and call sigwaitinfo(30)
+J2 exit from sigwaitinfo(), err=%d, signo=%d code=%d value=%d
+J3 starts and call sigtimedwait(29)
+J3 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d
+J4: AAAARRRRGGGHHH!!! killed by someone...
+J4 starts and call sigtimedwait(28)
+J4 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d
+main: kill(31), then wait until t=0.4 sec
+main: sigqueue(30), then wait until t=0.8 sec
+main: creating J1
+Error creating J1
+main: creating J2
+Error creating J2
+main: creating J3
+Error creating J3
+main: creating J4
+Error creating J4
+main: waiting 0.2 sec
+main: kill(J4)
+main: ending...
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#\#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ3#Æ3#¿3#¸3#±3#ª3#£3#œ3#@|"H|"H|"ó8#æ8#Ø8#Ç8#¬8#–8#†8#r8#c8#S8#F8#18# 8#8#ú7#S8#ç7#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš':#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€p(!€(#)h )èS#hD /ì^#€O5_#€O8ã :€OLCÌ`h4gI
\ No newline at end of file
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest1.c
===================================================================
--- branches/pj/pse51/ptest1.c (nonexistent)
+++ branches/pj/pse51/ptest1.c (revision 1085)
@@ -0,0 +1,221 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest1.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 1:
+
+ the main task create 4 tasks, J1, J2, J3, J4
+ at t = 0.2 sec. it raise a signal to J1
+ at t = 0.4 sec. it raise a signal to J2
+ at t = 0.8 sec. it kill J4
+
+ J1: it simply calls sigwait
+
+ J2: it simply calls sigwaitinfo
+
+ J3: it simply calls sigtimedwait with a timeout of 0.5 sec.
+
+ J4: it simply calls sigtimedwait with a -long- timeout
+ (J4 will be killed by main)
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+void *J1(void *arg)
+{
+ int sig, err;
+ sigset_t mask;
+
+ cprintf("J1 starts and call sigwait(31)\n");
+
+ sigemptyset(&mask);
+ sigaddset(&mask,31);
+ err = sigwait(&mask,&sig);
+
+ cprintf("J1 exit from sigwait(), err=%d, sig=%d\n", err, sig);
+
+ return 0;
+}
+
+void *J2(void *arg)
+{
+ int err;
+ siginfo_t info;
+ sigset_t mask;
+
+ cprintf("J2 starts and call sigwaitinfo(30)\n");
+
+ sigemptyset(&mask);
+ sigaddset(&mask,30);
+ err = sigwaitinfo(&mask,&info);
+
+ cprintf("J2 exit from sigwaitinfo(), err=%d, signo=%d code=%d value=%d\n",
+ err, info.si_signo, info.si_code, info.si_value.sival_int);
+
+ return 0;
+}
+
+void *J3(void *arg)
+{
+ int err;
+ siginfo_t info;
+ sigset_t mask;
+ struct timespec t;
+
+ cprintf("J3 starts and call sigtimedwait(29)\n");
+
+ sigemptyset(&mask);
+ sigaddset(&mask,29);
+ t.tv_sec = 0;
+ t.tv_nsec = 300000000;
+ err = sigtimedwait(&mask,&info,&t);
+
+ cprintf("J3 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
+ err, info.si_signo, info.si_code, info.si_value.sival_int);
+
+ return 0;
+}
+
+void uscitaJ4(void *arg)
+{
+ cprintf("J4: AAAARRRRGGGHHH!!! killed by someone...\n");
+}
+
+void *J4(void *arg)
+{
+ int err;
+ siginfo_t info;
+ sigset_t mask;
+ struct timespec t;
+
+ cprintf("J4 starts and call sigtimedwait(28)\n");
+
+ sigemptyset(&mask);
+ sigaddset(&mask,28);
+ t.tv_sec = 10;
+ t.tv_nsec = 0;
+
+ pthread_cleanup_push(uscitaJ4,NULL);
+ err = sigtimedwait(&mask,&info,&t);
+ pthread_cleanup_pop(0);
+
+ cprintf("J4 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
+ err, info.si_signo, info.si_code, info.si_value.sival_int);
+
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ int err;
+ sigset_t mask;
+ pthread_t j1, j2, j3, j4;
+ union sigval value;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+
+ /* main blocks signals for all the tasks */
+ sigfillset(&mask);
+ pthread_sigmask(SIG_BLOCK, &mask, NULL);
+
+ cprintf("main: creating J1\n");
+ err = pthread_create(&j1, NULL, J1, NULL);
+ if (err) cprintf("Error creating J1\n");
+
+ cprintf("main: creating J2\n");
+ err = pthread_create(&j2, NULL, J2, NULL);
+ if (err) cprintf("Error creating J2\n");
+
+ cprintf("main: creating J3\n");
+ err = pthread_create(&j3, NULL, J3, NULL);
+ if (err) cprintf("Error creating J3\n");
+
+ cprintf("main: creating J4\n");
+ err = pthread_create(&j4, NULL, J4, NULL);
+ if (err) cprintf("Error creating J4\n");
+
+ cprintf("main: waiting 0.2 sec\n");
+ while (sys_gettime(NULL) < 200000);
+
+ cprintf("main: kill(31), then wait until t=0.4 sec \n");
+ kill(0, 31);
+
+ while (sys_gettime(NULL) < 400000);
+ cprintf("main: sigqueue(30), then wait until t=0.8 sec \n");
+ value.sival_int = 300;
+ sigqueue(0, 30, value);
+
+ while (sys_gettime(NULL) < 800000);
+ cprintf("main: kill(J4)\n");
+ pthread_cancel(j4);
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/ptest2
===================================================================
--- branches/pj/pse51/ptest2 (nonexistent)
+++ branches/pj/pse51/ptest2 (revision 1085)
@@ -0,0 +1,437 @@
+ELF"4`d4 ( €""È@È@ HAÈP#ÈP# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸Ôæ"fe£èP#Áèfe£îP#ÈX#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼àƒ#Ç°¹%àc#Ç´¹%àƒ#£ÔX#‰ØX#ÈX#êµ"8ÎX#üèâÒê U‰å‹Eê ‰öU‰åƒì0ÆEéxÆEê-ÆEèh0"ƒì‹Eèf‰$ÆD$-èiÇ$’-#èaæƒÄh@"hLÞ#èã>ƒÄÿ5LÞ#h¬-#è<æÇ$À-#è0æh†h°"jEäPèMƒÄ …Àtƒì hÓ-#èæƒÄƒìÿuähæ-#èôåÇ$û-#èèåhE h°"jEàPèGMƒÄ …Àtƒì h.#è¿åƒÄƒìÿuàh!.#è¬åÇ$6.#è åƒÄƒì jèn<ƒÄ=vìƒì hM.#è{åƒÄÿuäè˜NƒÄÿuàèNÇ$c.#èY布ÄÉÍvU‰åƒìÿ5lÞ#hp-#è6åƒÄÉÐU‰åSƒì‹]Sÿ5lÞ#h€.#è庅ëQ‰Ø÷êÁúÁû)ڃÄRÿ5LÞ#è9>ƒÄ‹]üÉÐU‰åƒìÿ5LÞ#èû=ƒÄ Pÿ5lÞ#hÀ.#èÇäƒÄÉÉöU‰åSƒì ‹]h$"hÜX#è¯OƒÄÿ5lÞ#hà.#è”äƒÄSÿ5LÞ#èÉ=ƒÄÿ5LÞ#è—=ƒÄ Pÿ5lÞ#hÀ.#ècäƒÄÿ5lÞ#h€-#èP七Ä‹]üÉÍvU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾àX#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
+è֜E¨‰$ècƒÄ…Àyƒì h /#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=ðY#„¶€ú*t€úªt
+€ú6t€ú¶uÆðY#¸é›„Òy,ÆðY#€ú¸uÆüY#ÆòY#ëՀúuÐÆüY#ëljöÆðY#€ú8u€ +üY#ÆòY#멀úu € +üY#뛉ö€ú5uf¾•„#·Àé)v€ú…•f¾|„#·Àé +v€úàuÆðY#éTÿÿÿv€ú*t€ú6u2ÆñY#€ú*u€ +üY#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ +üY# éÿÿÿv€úªt€ú¶u"ÆñY#€úªt €ú¶…öþÿÿÆüY#éêþÿÿ€úFu€=õY#•õY#ë.v€ú:u€=óY#•óY#ëv€úEu;€=ôY#•ôY#ƒì¶õY#P¶óY#P¶ôY#Pèõ¸ƒÄé€úu€ +üY#éhþÿÿv€ú8u€ +üY#éTþÿÿv€út€ú¸uÆüY#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+€úHt€úIu€=ôY#uT€=ñY#uK·Â +ÿë~€=óY#t/Bð< vBâ<vBÔ<w€=ñY#t¶Âf¾€`„#·ÀëG€=ñY#t¶Âf¾€…#·Àë-v€=òY#t¶Âf¾€ …#·Àëv¶Âf¾€`„#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  üY#ƒÈ@ë‰ö üY#ˆE؈UيE׈EÚ±»;X„#}8¾àƒ#v݊D2:EÚuŠ2:EØuƒì Wÿ’äƒ#±ƒÄC;X„#|ЄÉuƒìjW¿"†#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£ìY#Šˆb„#ŠPˆc„#ŠPˆd„#ŠPˆe„#ŠPˆf„#ŠPˆg„#ŠPˆh„#ŠPˆi„#ŠPˆj„#ŠP ˆk„#ŠP
+ˆ…#ŠP ˆ…#ŠP ˆ…#ŠP +ˆ…#ŠPˆ…#ŠPˆ…#ŠPˆ…#ŠPˆ …#ŠPˆ
+…#ŠPˆ …#ŠPˆl„#ŠPˆ …#ŠPˆm„#ŠPˆ +…#ŠPˆz„#ŠPˆ…#ŠPˆ{„#ŠPˆ…#ŠPˆ‡„#ŠPˆ'…#ŠPˆˆ„#ŠPˆ(…#ŠP ˆ‰„#ŠP!ˆ)…#ŠP"ˆ•„#ŠP#ˆ5…#ŠP$ˆ“„#ŠP%ˆ3…#ŠP&ˆ”„#ŠP'ˆ4…#ŠP(ˆ‹„#ŠP)ˆ+…#ŠP*ˆ™„#ŠP+ˆ9…#ŠP,ˆn„#ŠP-ˆ…#ŠP.ˆo„#ŠÖˆ…#ŠP0ˆa„#ŠP1ˆ…#ŠP2ˆ|„#ŠP3ˆ…#ŠP4ˆd…#ŠP5ˆO…#ŠP6ˆP…#ŠP7ˆQ…#ŠP8ˆK…#ŠP9ˆL…#ŠP:ˆM…#ŠP;ˆG…#ŠP<ˆH…#ŠP=ˆI…#ŠP>ˆR…#ŠP?ˆS…#ŠP@ˆ®„#ŠPAˆ—„#ŠPBˆ•„#ŠPCˆª„#ŠPDˆN…#ŠPEˆ7…#ŠPFˆJ…#ŠPGˆ~„#ŠPHˆ…#ŠPIˆ„#ŠPJˆ0…#ŠPKˆŽ„#ŠPLˆ.…#ŠPMˆ€„#ŠPNˆ …#ŠPOˆr„#ŠPPˆ…#ŠPQˆ„#ŠPRˆ!…#ŠPSˆ‚„#ŠPTˆ"…#ŠPUˆƒ„#ŠPVˆ#…#ŠPWˆw„#ŠPXˆ…#ŠPYˆ„„#ŠPZˆ$…#ŠP[ˆ…„#ŠPRˆ%…#ŠP]ˆ†„#ŠP^ˆ&…#ŠP_ˆ’„#ŠP`ˆ2…#ŠPaˆ‘„#ŠPbˆ1…#ŠPcˆx„#ŠPdˆ…#ŠPeˆy„#ŠPfˆ…#ŠPgˆp„#ŠPhˆ…#ŠPiˆs„#ŠPjˆ…#ŠPkˆ„#ŠPlˆ…#ŠPmˆt„#ŠPnˆ…#ŠPoˆv„#ŠPpˆ…#ŠPqˆ„#ŠPrˆ/…#ŠPsˆq„#ŠPtˆ…#ŠPuˆ„#ŠPvˆ-…#ŠPwˆu„#ŠPxˆ…#ŠPyˆŒ„#ŠPzˆ,…#ŠP{ˆº…#ŠP|ˆ»…#ŠP}ˆDž#Š@~¢È…#]ÍvU‰åWVSƒì\‹]}ؾZ#ü¹󥿸ƒ=øY#…Qº¾`„#¹…#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇCìX#ƒì ÿsèûÿÿÇ$jjjhY/#èϔf£"†#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhY/#è0˜f£$†#ƒÄfƒøÿuƒì ¿"†#P蕛¸ýÿÿÿ頍vÇX„#ƒ{ÿuÇC "ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+ÇE̍E¨ë‹ƒì jjPh("hb/#èÿ‰ÃƒÄ ‰(†#ƒøÿu'ƒì ¿"†#P蓚¿$†#‰$脚‰Ø钐ƒ=Z#uWƒì ÿ5(†#艉ǃąÿt4ƒì ¿"†#PèLš¿$†#‰$è=šƒÄÿ5(†#èg5¸üÿÿÿë=ÇZ#ëèƒì¶õY#P¶óY#P¶ôY#PèûÇøY#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿$†#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿$†#Pèõ›·ÀƒÄÉÐU‰åSƒ=X„#0‹ +X„#Í»àƒ#‹Ef‰ŠE
+ˆD‹E ‰‚äƒ#A‰ +X„#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=øY#t9蓃ì ÿ5(†#è-4¿"†#‰$è昿$†#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$H/#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t +‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t +‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆZ#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ÆZ#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=Z#„þÆZ#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆZ#¸eô[^_]ÃU‰åVS¡$Z#…Àt¡$Z#H£$Z#¸é²¸ë6ƒ=Z#uKŠ Z#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿZ#뤍v¸ë:ƒ=Z#uGÇZ#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡(Z#@£(Z#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆZ#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=Z#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡(Z#@£(Z#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆZ#¸eô[^_]ÍvU‰åƒìÇD‡#Ç@‡#ƒ=Z#t!úè‹õÿÿ£Z#ÇZ#û…Àtúèôÿÿû¡Z#…Àuƒìÿuh ""jèQ¸ƒÄÉÍvU‰åVS¡$Z#@£$Z#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡$Z#@£$Z#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡@‡#@%ÿ£@‡#Š€@†#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=0Z#t(Ǥ‡#Ç ‡#Ǩ‡#Ç0Z#‹E£,Z#ƒ=Z#t!úèôÿÿ£Z#ÇZ#û…Àtúèòÿÿû¡Z#…Àu.¸ìÿÿÿ€=Z#t ƒìjÿhH""j èOÆZ#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ ‡#@ƒà?£ ‡#º`‡#ŠˆA¡ ‡#@ƒà?£ ‡#Šˆ¡ ‡#@ƒà?£ ‡#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=Z#tèäùÿÿƒì j èŽOÆZ#¸ƒÄÉÐU‰åƒìƒ=Z#t!úè óÿÿ£Z#ÇZ#û…Àtúè™ñÿÿû¡Z#…Àt¸ë¶Z#ÉÍvU‰åVSŠEŠU€} t ƒ + Z#ë ‰öƒ% Z#„Àt ƒ + Z#ëƒ% Z#„Òtƒ + Z#ë¸ë6¸ëbƒ% Z#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿZ#[^]ÐU‰åSƒìœúX‰Ã€=Z#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡@‡#;D‡#t¡D‡#ˆˆ@†#@%ÿ£D‡#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=¨‡#u €úúu¡(Z#H£(Z#郍v÷ÂÀuxÿ¨‡#œúX‰Á¡ ‡#;¤‡#t¡¤‡#ˆ`‡#@ƒà?£¤‡#ë"‰ö¡¤‡#+¨‡#ƒÀAƒà?£¤‡#Ǩ‡#‰ÈPƒ=¨‡#uǨ‡#ƒì ÿ5,Z#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<Åhß#uèùÝNj¸ÿÿÿÿ鏐ƒ=@Þ#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€Aß# t ÿ€Dß#ë-v‹EÑàE‰ÂÁâ)‹ÕDß#ƒì‹• Þ#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€Aß# t ÿ€Dß#ë2v‹EÑàE‰ÂÁâ)‹ÕDß#ƒì‹• Þ#ÿuRÿP@蔃ĉØPé­úèJ²‹lÞ#R‰ÑÁá)Ñ»@ß#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€Dß#ë?vƒìU‰ÐPjÿlZ#‹MI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@è/ƒÄ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ=@Þ#„“œúX‰ÇÇEð}ð™s¾@ß#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€Dß#ë6ƒìEðPjÿlZ#‹MðI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾@ß#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€Dß#ë8vƒìEðPjÿlZ#‹MðI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ÇEð}ð™w¾@ß#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€Dß#ë8v‹MðI‰ÐÁà)ЋÅDß#ƒì‹• Þ#QRÿP@ƒÄEðPjÿlZ#ƒÄÿEð}ð™~èÞ ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jèl–ƒÄUð¡(ß#;xÞ#|¡$ß#+tÞ#‰Eð¡(ß#+xÞ#ë!‰ö¡$ß#+tÞ#H‰Eð¡(ß#+xÞ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qè. ƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRLè{ ƒÄhlÞ#jÿlZ#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèV ¡lÞ#@‰ÂÁâ)¿ÕHß#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìhÌ("è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=8Z#u(èè
+ƒì ¡lÞ#@‰ÂÁâ)¿ÕHß#Pèt­ƒÄÉÍvU‰åWVSƒìhj/#è]$ƒÄ»@ß#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì häÞ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾@ß#¡4Z#‰3@£4Z#‹E ‰DƒìjÿuƒTß#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B +‰ƒ@ß#¿Dß#Ç;¾Hß#¡lÞ#@‰ÂÁâ)‹DÖ0‰3ºLß#ǍAP‹]ð‰˜@ß#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁ ß#°Ç8Ç0ǁÁÀǁ@ß#Ç9ºۍƒ€ 
+Ç…¤ß#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂHß#ÿÿÿÿǂLß#”ß#‰à#º‹Mðɍ€ ‰ö
+Ç…à#Bƒú~ì»ëC;pÞ#sƒì‹ Þ#ÿuSÿPƒÄ…Àxß;pÞ#u7‹]ð[‰ÂÁâ)ÂfÇÕhß#ƒìhäÞ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžDß#ƒì‹ Þ#ÿuÿuðSÿP,ƒÄ…ÀyWfdžhß#ƒìhäÞ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5dÞ#s0ƒìµ‹ƒß#WVÿP ƒÄ…Àxۃ싃ß#WÿuðVÿP$ƒÄ;5dÞ#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰ÕLß#‰Æ‹UÑâU‰ÐÁà)Ѓ Åpß#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅnß#Pè@‹UÑâU‰ÑÁá)Ñ»Lß#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»@ß#·DÓ.ƃì ·GPjÿwVh¸/"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ ÕHß#ƒìU‰ÐPjÿlZ#ƒÄöGu ÿ`Þ#ëvöGuÿ ß#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅDß#‹… Þ#ƒx(„èà…À‰€»;dÞ#svƒì‹ß#VSÿP(ƒÄC;dÞ#råv‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿR0fǃhß#ƒÄhäÞ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;dÞ#svƒì‹ß#VSÿP(ƒÄC;dÞ#råv‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿR0fǃhß#ƒÄhäÞ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡lÞ#@‰ÂÁâ)¾@ß#SÿTÖú‰$èn¡lÞ#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº@ß#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸Dß#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹Hß#‰Mì‹Uä‹
+‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…¤ß#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ +lÞ#I‰ÐÁà)ЍÅö‚pß#tɍ€È‚øß#…¤ß#¡$ß#;tÞ#|;tÞ#uA¡(ß#;xÞ#}4ƒìSÿ5lÞ#ÿ5xÞ#ÿ5tÞ#ÿ5(ß#ÿ5$ß#h€/#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ +lÞ#I‰ÐÁà)ЍÅöƒpß#„›ɍ€ȍ‹°Hß#ºDß#‹t‚`‹”À¸Lß#94s‰4‹lÞ#[‰ÁÁá)ÁÁፁÀ°@ß#¿Dß#B‰8±°‹†Hß#@º‰Ñº÷ñ‰–Hß#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàº@ß#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õà#‰…ötI‰ÂÁâ)‹Õüß#‰…ÿtI‰ÂÁâ)‹Õà#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕøß#‹…¤ß#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàº@ß#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ@ß#ǀDß#ǂüß#û¸]ÍvU‰åWVSƒì ƒ=lÞ#ÿt¡lÞ#@‰ÂÁâ)ÂöÕpß#…3ƒ=lÞ#ÿ„ƒìh$ß#j證ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë"v¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QènüÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)Ћ<ÅDß#ƒì‹½ Þ#QWÿP<ƒÄ¿4½ƒì ‹† Þ#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅDß#‹… Þ#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5lÞ#‰€Þ#‰lÞ#[‰ÐÁà)Ð;Őß#t0»@ß#‰ö¡lÞ#@‰ÂÁâ)‹TÓP‰lÞ# R‰ÈÁà)È;TÃPu×;5lÞ#tƒìhlÞ#jÿlZ#ƒÄ‹ +lÞ#I‰ÐÁà)ÐÁà¾@ß#fÇD(‹¸Dß#ƒì‹½ Þ#‹€Þ#¸;lÞ#•ÀPQWÿS8¡lÞ#@‰ÂÁâ)ƒÄöDÖ1„Ü¡€Þ#;lÞ#…Ë¡$ß#‰EèMè¡lÞ#@‰ÂÁâ)»Lß#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5(ß#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡lÞ#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjhä="ÿuìÿuèÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèû7ƒÄ‰|Þ#¡$ß#£tÞ#¡(ß#£xÞ#eô[^_]ÉöU‰åWVSƒìÇО%úÿuèD»ƒÄ¿Dß#¾@ß#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂLß#ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀHß#ǀLß#‚„ß#Ç@ÇǂŒß#BP‰0Ç8ÇD`DŽÐ‚â#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀHß#ǀLß#ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀHß#ÿÿÿÿǀLß#ºۍƒ€ 
+DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹Hß#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ@œ%ÿÿÿÿ»™¹Lß#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇœß#ÿÿÿÿÇäÞ#ÇhÞ#Ç`Þ#Ç ß#Ç€Þ#ÿÿÿÿÇlÞ#ÿÿÿÿÇ|Þ#ÿÿÿÿÇxÞ#ÇtÞ#ÇpÞ#ÇdÞ#Ç@Þ#èÚè}è42ƒì ÿuèqÉÿÿ£èÞ#ƒÄ=×Övƒì hà/#èÇ$è »ƒÄ¸ƒ=èÞ#”À‰Eè]è¡èÞ#‰CÇО%躂ƒì S豌Ç$x>"èÇÇ$¸("聎Ç$Ð="蕎ƒÄjjèEÿtZ#ƒÄh$ß#jèLƒèOùÿÿèê›f£àÞ#¡lÞ#@‰ÂÁâ)¾@ß#¿DÖ‰$èϛÇ$è7ŽÿpZ#ÇО%ƒÄ»ƒ=hÞ#ŸÃSjèɃă= ß#teè„ Ç8Z#ƒìh$ß#j軂è^›f£àÞ#è³øÿÿÇ$Ð="èǍ¡lÞ#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇО%ƒìSjèCèÇО%ƒÄjjè(ƒÄúƒ=hÞ#t"ƒìÿ5hÞ#h 0#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=8Z#…•èW‰…Àuú腚‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹E£hÞ#Ç8Z#ƒ=lÞ#ÿ„ƒìh$ß#j藁ƒÄUð¡(ß#;xÞ#|¡$ß#+tÞ#‰Eð¡(ß#+xÞ#ë ¡$ß#+tÞ#H‰Eð¡(ß#+xÞ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèZôÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿR<Ç€Þ#ÿÿÿÿÇlÞ#ÿÿÿÿƒÄèü‡…Àtƒì ¿àÞ#Pè,™ƒÄëvƒì ¿àÞ#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»º Þ#¡ Þ#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwº Þ#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇ|Þ#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=О%tƒ= ß#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸hÞ#ƒ=lÞ#ÿt‹lÞ#R‰ÐÁà)ЍÅ ß#]ÉöU‰åSƒìœúX‰Ãƒ=О%tƒ= ß#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹È‡#t[¿À‡#ƒ<9tP‹lÞ#ҍ‚€Ð؍…о@ß#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹lÞ#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt +ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾À‡#»Ä‡#¹È‡#vRÁàÇ0B‰Çƒú~ãǸ#ÿÿÿÿÇÀ#Çȇ#ÇÀ‡#Çć#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=À#ÿu û¸ ënv¡À#@Ǖȇ#‰¡À#@‹…ć#£À#‹@‹U ‰…À‡#º»@ß#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡lÞ#À’ÂU‹•à#û]ÍvU‰å‹Múƒùw +Iƒ<…ȇ#u û¸ë%v¡lÞ#À’ÂʋE ‰•à#û¸]ÃU‰åS‹]œúX‰Áƒûw +[ƒ<…ȇ#u‰ÈP¸ë.v[Áà‹À#‰Ä‡#ǀȇ#‰À#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡lÞ#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿@ß#öD0 tm‹E‰‚ à#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºHß#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿRD‰tPƒÄ¹»@ß#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Ŕß#t[»Dß#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»@ß#¿DÓPèÔyƒÄEðPjÿlZ#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4ÕLß#èÁ ƒÄ»;dÞ#sƒì‹ß#ÿuðSÿP(ƒÄC;dÞ#rã‹MðI‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRPÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕpß#u&ÿ +`Þ#ƒ=`Þ#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕpß#uÿ + ß#ƒ= ß#uèúÿÿƒìh$ß#jèÒyƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº@ß#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅqß#tû雉ö;5lÞ#uJv‰ÐÁà)л@ß#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)Ё Åpß#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡€Þ#@‰ÂÁâ)Âf‹Mòf; Õlß#”Eñ¾¿@ß#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5lÞ#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡€Þ#@‰ÂÁâ)¿ÕHß#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿@ß#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+uB»ë‰öC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡lÞ#@‰ÂÁâ)»@ß#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡<Z#ʼnŠà#‰šä#@£<Z#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡lÞ#@‰ÂÁâ)¿ÕHß#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=‘#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ +‘#‰ÊÁâ‹‚ŒŽ#£‘#‹E‰‚€Ž#‹E ‰‚„Ž#‰ðƒà‰‚ˆŽ#‰ðƒàƒøtOƒø
+ƒøt +ësvƒøtSëi‰ÈÁàǀŒŽ#ÿÿÿÿƒ=‘#ÿu‰ +‘#ë¡‘#Áà‰ˆŒŽ#‰ +‘#ëH‰ö‰ÊÁâ¡‘#‰‚ŒŽ#‰ +‘#ë.‰ÊÁâ¡ ‘#‰‚ŒŽ#‰ + ‘#ë‰ÊÁâ¡‘#‰‚ŒŽ#‰ +‘#‰ØP¸[^]ÐU‰åƒìƒ=pÞ#uƒì h@0#èŒÇ$謃ġpÞ#P‰pÞ#ÉÐU‰åƒìƒ=dÞ#uƒì h_0#èPÇ$èÌ«ƒÄ¡dÞ#P‰dÞ#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿ詶ÿÿƒÄeô[^_]ÉöU‰å¸¹ŒŽ#v‰ÂÁâ@‰
+ƒø&~òÇü#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹‘#Ç‘#ÿÿÿÿë:‰ö‹‘#Ç‘#ÿÿÿÿë&‰ö‹ ‘#Ç ‘#ÿÿÿÿë‰ö‹‘#Ç‘#ÿÿÿÿÇ@Þ#ƒûÿtM¾ŒŽ#…ÿt‰ØÁàƒ¸ˆŽ#uƒì ‰ØÁàÿ°„Ž#ÿ€Ž#ƒÄ‰Ù‰ØÁà‹0‰Â¡‘#‰2‰ +‘#ƒûÿu¸Ç@Þ#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$ ‘#èÅӃÄjjhÿÿjh$‘#h ‘#èðɃÄjjhÿÿÿhh@‘#h ‘#èÐɃÄjjhÿÿÿþhh\‘#h ‘#è°ÉƒÄ ƒ}ütƒì‹EüHPÿuøh ‘#èzȃă}ôtƒìÿuôÿuðh ‘#è^ȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh ‘#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh ‘#è¸ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh ‘#è²ËƒÄ ÉÐU‰åƒì ÿu ÿuh ‘#èfЃÄÉÐU‰åƒìÿuh ‘#èM΃ÄÉÃU‰åƒìÿuh ‘#èM҃ÄÉÃU‰åƒì jÿuh ‘#èSɃÄÉÉöU‰åƒì ÿu ÿuh ‘#èþσÄÉÐU‰åƒìh ‘#è ÎÇ$ ‘#è ҃ÄÉÍvU‰åWVSƒì} ‹uEðPh´0#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;@Z#~hƒìWVh€‘#蜃Äj
+VèK›ƒÄ»…À•ÃœúX‰Æƒìh€‘#‹Eðÿ4…DZ#h¹0#è]™ƒÄ…Ûuƒì h\1#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh´0#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;@Z#~JƒìVSh€‘#èB›ƒÄj
+S臚ƒÄœúX‰Ãƒìh€‘#‹Eôÿ4…DZ#h¹0#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5€•#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5€•#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuhÁ0#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5€•#èc6ƒÄÉÉöU‰åƒìÿ5€•#èc6ƒÄÉÉöU‰åƒìÿ5€•#è{5ƒÄÉÉöU‰å‹E‹U ‹M£€•#‰„•#‰ +ˆ•#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5€•#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5€•#è3‰ÃƒÄ…Ûu#ƒìÿ5€•#èx5ƒÄ+PWÿ5ˆ•#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5€•#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5€•#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u +ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹â#‰U苀â#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õâ#|[‰Eäv1‰ÐÁà)ЍÅ;šâ#u ‹Eì;‚â#|1‰Ï‰ÐÁà)Ћ Řß#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åâ#}«ƒÿÿt‰ÐÁà)ЋU‰Řß#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лDß#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»Hß#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Řß#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹Lß#‹°Hß#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»Hß#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»Lß#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŘß#‰ƒøÿt@‰ÐÁà)ÐÇŜß#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰՜ß#[‰ÂÁâ)ÕP‹‰‚Hß#ǂLß#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡lÞ#@‰ÂÁâ)4Õ@ß#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ —#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì R范ċ^8‰Ø÷Ћ + —#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<Åhß#u +¸éӍvú‰ÈÁàö€¨•#uƒ¸ •#uû魉öv‰ÐÁà)ЍÅ|ß#ƒùvèÍ©Çë
+¸Óà »ëC;hZ#}ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»hß#u&ƒìh¤—#VèÔüÿÿ‹ƒDß#ƒÄ‹… Þ#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ •#ü¹‹}ó¥…Òt‰ßÁçÇ •#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<À—#ÿtq4‰uìºÀ—#‹@Áà‰Eè‰ÇƒÇ‹ +à¤%¸àž%‹U苉E䋇äž%©t +ƒàý‰‡äž%ë‰ö¾À—#‹Uì‹2@‰ Õàž%‰Áƒ}äÿu»‰ +à¤%ǝÀ—#ÿÿÿÿƒûv +è¨Çë¸þÿÿÿˆÙÓÀ! —#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà# —#…Àt +‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà  —#‹5¤—#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)Ѝŀß#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸hß#u|ß#ƒûv +輦Çë 8ƒìh¤—#Vèúÿÿv‰ÃÁã)ÃÁ㋃Dß#ƒÄ‹… Þ#VPÿRDÃà¾@ß#ƒÄƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Řß#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸hß#„…xß#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅ|ß#ƒûvèÃ¥Çëv 8»ëvC;hZ#}0ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 +‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà# —#…Àt ‹UԉÐPéÃ=à¤%ÿu‹MԉÈP¸ 鮉ö‹5à¤%vÁà¹àž%‹‰à¤%‹U ‰äž%‹U‰èž%‹U‰ìž%‹lÞ#‰ðž%Çÿÿÿÿ‹E ÁàºÀ—#ƒ<ÿu‰4ë>‰ö‹M ‹À—#‰ÁЃ<Åàž%ÿt»àž%
+‹Í 
+ƒ<ÃÿuîR‰4Åàž%ƒ} vèé£Ç됸ŠM Óà  —#‹5¤—#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)Ѝŀß#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸hß#u|ß#ƒ} vèS£Çëv ƒìh¤—#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃Dß#ƒÄ‹… Þ#VPÿRDÃà¾@ß#ƒÄƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Řß#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸hß#„…xß#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅ|ß#ƒ} vèV¢Çë‰ö »ëvC;hZ#}0ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=dZ#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡lÞ#@‰ÂÁâ)<Õ@ß#èŠú¡ —##„Hºv©u=BÑøuô¾ƒ<µÀ—#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ! —#ûév µºÀ—#‹[‹Åàž%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ! —#W<ƒþv +èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹äž%‹
+‹u ‰‹‚èž%‰F‹‚ìž%‰FƒÂ‹
+©t ƒàý‰
+ëv[¡à¤%‰Õàž%‰à¤%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u +û¸ éÓ‰ö‹‰G@úèu‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jèN\ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèÏÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRHƒÄh¤—#ÿ5lÞ#èæòÿÿ¡lÞ#@‰ÂÁâ)ÂfÇÕhß#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày +ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5lÞ#hdp"ÿuÜÿuØÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèù ƒÄ¡lÞ#@‰ÂÁâ)‰Õ â#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿè‡Ðÿÿƒì ¡lÞ#@‰ÂÁâ)»@ß#¿DÓPèsè”ÇG@¡lÞ#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡ —##„ûº‰ö©uáBÑøuô¾ƒ<µÀ—#ÿu=‹M ‰1ÇAÇAƒþv +è@Çë¸þÿÿÿ‰ñÓÀ! —#ûé vƒì µƒÀ—#Pèúðÿÿ‰ÇƒÄƒ»À—#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ! —#Áâ¹äž%‹
+‹] ‰‹‚èž%‰C‹‚ìž%‰CƒÂ‹
+©t ƒàý‰
+ëv¡à¤%‰Õàž%‰=à¤%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡lÞ#@‰ÂÁâ)4Õ@ß#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jè6XƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèúÊÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRHƒÄh¤—#ÿ5lÞ#èÍîÿÿ¡lÞ#@‰ÂÁâ)»@ß#fÇDÓ(ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿè Íÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=H˜#ÿu
+ÇEèëWMèUð¡D˜#;B|¡@˜#+Eð‰Eè¡D˜#+Bëv¡@˜#+EðH‰Eè¡D˜#+Eôʚ;‰Aƒì ÿ5H˜#ÿHÞ#ƒÄ…ÛtN]ð‹Eð£@˜#‹Eô£D˜#jhÄp"ÿuôÿuðÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè:ƒÄ‰H˜#ë +vÇH˜#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µÀ—#ÿuC‰uèÇEìÇEð¡lÞ#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ! —#降 µºÀ—#‹[‹Åàž%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ! —#[Áà¹äž%‹‰U苐èž%‰U싐ìž%‰Uð‹ðž%‰UôP‹
+©tƒàý‰
+ë[¡à¤%‰Õàž%‰à¤%ƒìEèPVè
+ƒÄeø[^]ÃU‰åVSƒì¡lÞ#@‰ÂÁâ)4Õ@ß#‹F0©…Í +‰F0‹F8‰Ã÷Ћ —#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ + —#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+CÑøuòº‰UèÇEìÇEð¡lÞ#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡lÞ#@‰ÂÁâ)Õ@ß#‰UЉÞÁæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShÌ0#èw}ƒÄ÷Eàtƒì‹M ÿqhâ0#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv +èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv +è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾@ß#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄƒìh¤—#Wèúèÿÿ‰ÂÁâ)‹ÕDß#ƒÄë ‰ÐÁà)ÐÁàfƒ¸hß#u!‹Dß#ƒì‹• Þ#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿¨•#¾¤•#»¬•#¹À—#‰ö‰ÐÁàǀ •#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»àž%¹äž%RÁàB‰ÇDƒú>~éÇȤ%ÿÿÿÿÇܤ%Çà¤%Ç —#Ǥ—#ÿÿÿÿÇH˜#ÿÿÿÿº¹™#»™#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhDk"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu +‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5lÞ#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡lÞ#@‰ÂÁâ)¡ —# Õ|ß#‰¸]ÉöU‰åSƒì‹E‹U ú‹lÞ#‰lÞ#ÇdZ#jPj jèœìÿÿƒÄÇdZ#‰lÞ#û‹]üÉÍvU‰åS‹M‹] ¡hZ#ʼnŠ`˜#‰šd˜#@£hZ#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…™#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹™#‹E ‰
+‹E‰‚™#ÆD
+ƒìjhq"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹lÞ#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸@ß#DŽàÿÿÿÿL0ƒìh¤—#Vèõãÿÿ‹ƒDß#ƒÄ‹… Þ#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇH˜#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿlZ#‹UüRÁ๙#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…™#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=À #ÿt ƒ=à¤%ÿuûèƒÇ ¸ÿÿÿÿéCv¡À #‰‹À #Õ)пę#‹DÇ0£À #‹Õ)йÀ™#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅș#닍<Å)Ǎ<ýÀ™#ü¹ó¥‹Õ)ЍŃºÀ™#u#¡à¤%‰‚è™#@Áàƒˆôž%‹€àž%£à¤%‹Õ)ÐÇÅԙ#ÿÿÿÿ‹Õ)ЍÅؙ#Ç@NjÕ)ЍÅà™#Ç@NjÕ)ÐÇÅì™#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Åð™#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀð™#ƒÀºÄ™#ƒ<ÿtƒì ÿ4ÿHÞ#ƒÄÝ)ØÁàƒ¸À™#uE‹è™#R Åöôž%u¡à¤%‰àž%‰à¤%Ý)؋Åè™#@ƒ$Åôž%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸À™#…‹P ‹‚È™#@öÅôž%t¸Ì™#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJ̙#¾È™#‹7@‹à¤%‰Ýàž%£à¤%jÿ41ÿ±Ä™#jèhçÿÿ‹7@ƒ Åôž%錐‹E´Áà+E´Áà¹À™#ƒ<uwPƒ<
+tÿ°È™#ÿ°Ì™#ÿ4
+ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´ÁàÈ™#Rÿ°Ì™#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸È™#u +ƒ¸Ì™#„Àºà™#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒØ™#‰ƒà™#‹AƒÜ™#‰B…Àyÿ‹à™#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hÐs"ÿ4Åä™#ÿ4Åà™#ÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè+ùÿÿƒÄ‹E´Áà+E´‰Åԙ#ë‰ö‹E´Áà+E´ÇÅԙ#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Åð™#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Åԙ#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹à™#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹à™#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹Ø™#õ)ðÁà‹‰‹D‰Gõ)ðÅºÄ™#ƒ<ÿtƒì ÿ4ÿHÞ#ƒÄ‹Eƒxu
+ƒx „þºØ™#õ)ð ŋ]‹‰
+‹C‰D
+÷E t¸à™#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘à™#‹Eè‹]C‰à™#‹EìC ‰B…Àyÿ‰à™#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhÐs"ÿ4Åä™#ÿ4Åà™#ÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè­öÿÿƒÄõ)ð‰Åԙ#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Åð™#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Åԙ#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹à™#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹à™#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹Ø™#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt +ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Åð™#uûè܆ǸÿÿÿÿëvÕ)ЋÅì™#ûÉÐU‰åWVS¹»Ä™#¿À™#¾Ì™#‰öÍ)ÈÁàÇDÿÿÿÿØ™#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ¼ #ÿÿÿÿÇÀ #[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡lÞ#@‰ÂÁâ)¾@ß#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡lÞ#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡lÞ#@‰ÂÁâ)¹@ß#‹DÑ0Áèƒà‹U ‰¡lÞ#@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡lÞ#@‰ÂÁâ)¹@ß#‹DÑ0Áè ƒà‹U ‰¡lÞ#@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5dÞ#s9v‹µß#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5dÞ#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…ß#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µ Þ#ƒìÿ°ôh1#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°Dß#……ƒÀ º@ß#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀP訃Äë%v·Ð¸ó0#ú€t¸ÿ0#út¸ 1#P[‰ÐÁà)ÐÁàÿ°â#Tß#PSh€1#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹… Þ#‰Eð‹¸üƒì ‹Uð‹‚ðøPèk§‰ÆƒÄƒþÿu +¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åöqß#tRQ@»Lß#ƒ<D‹$â#‰ƒìý‰Ø‹Uð‚ðPVèX¥ƒÄ‹Eð˜ðSV聦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹… Þ#‰Eð‹Mƒy(…©‹=lÞ#‰ÐÁà)ЍžDß#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йLß#‹D@‰D@‹„à‰„àƒÂ0¹@ß#‹
+%ÿ÷ÿÿ‹\0ã ؉
+‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»Dß#‹A‰„Ѓyt‹A‰‚Œß#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰Œß#‹“ô‰$â#ƒy$u‹E @‰ÐÁà)Ё Åpß#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<• Þ#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅâ#‹—ðÂPÿu 襤酋E @‰ÐÁà)ЍÅöƒqß#t?K@¾Lß#ƒ<11ºDß#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èG¤ë*ƒì‹E @‰ÐÁà)ЋÅâ#‹—ðÂPÿu 诣ƒÄ‹E @‰ÐÁà)ÐfÇÅhß#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã +f‰E¸‹ Þ#‹€ø‰EÈÇE̍E¸jjPhˆ"h%1#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì hÀ1#èVËÿÿƒÄ‹< Þ#v‰ÐÁà)Ðfƒ<Åhß#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃„ß#PjèJ;fǃhß#€ƒÄ‹ƒâ#‹—ðÂPVèࢃčeô[^_]ÐU‰åWVSƒì‹}h*1#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPh@1#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄSh^1#è‡Êÿÿ‹Eð‰… Þ#ƒÄ jhj1#Sè=efÇCÆCÇCx‡"ÇC¤‡"ÇC l}"ÇC$L~"ÇC(°‡"ÇC, "ÇC0¼‡"ÇC4ć"ÇC8Ї"ÇC<„€"ÇC@ˆ"ÇCDœˆ"ÇCHäˆ"ÇCLìˆ"ÇCP„‰"ÇCT̉"ÇCXŠ"ÇC\äŠ"ÇC`‹"ÇCd‹"ÇCh4‹"ÇClL‹"ÇCpd‹"ÇCt|‹"ÇCx”‹"ÇC|¬‹"ǃ€Ä‹"ǃ„Ü‹"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè柃ÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh€"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹ Þ#‰Eð…Éx[; +pÞ#sS‹ Þ#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<Åhß#u +¸éèvv‰ÐÁà)Ð9 ÅDß#t +¸&éȍv…Ûuv‰ÐÁà)Ё Åpß#ë)ƒûuv‰ÐÁà)Ё$Åpß#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿Dß#‹U9;t\f¸hß#€u=ƒì‹;‹Mð‹‘ðÂPV蘞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV赟ƒÄëv‰ÐÁà)ЋU‰Åâ#¸eô[^_]ÍvU‰åVS‹M‹4 Þ#…Éx; +pÞ#s‹ Þ#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡lÞ#@‰ÂÁâ)¸ÿÿÿÿ9 ÕDß#uZúè!P‹lÞ#R‰ÑÁá)Ñ»@ß#f‰DËdžèX­ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹… Þ#‹€ü]ÍvU‰å‹E‹… Þ#‹€ô]ÍvU‰åS‹]‹M …ÛxU;pÞ#sM‹ Þ#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<Åhß#u¸ëMI‰ÐÁà)Ð9ÅDß#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öqß#”À‹U‰‹‘â#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E +9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹… Þ#I‰ÐÁà)ЋÅâ#‹“ðÂPQè7œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<… Þ#v‰ÐÁà)Ðfƒ<Åhß#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃„ß#PjèR5fǃhß#€ƒÄ‹ƒâ#‹—ðÂPVè蜃čeô[^_]ÐU‰åSƒì ‹E‹M ‹… Þ#I‰ÐÁà)ÐÁàfǀhß#€‹€â#‹“ðÂPQ蜜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹• Þ#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃„ß#Pjè‹4ÿ 7ƒÄ‹ƒâ#‹Mð‹‘ðÂPÿu 趛fǃhß#€ƒÄë‹E @‰ÐÁà)ÐfÇÅhß#eô[^_]ÐU‰åƒì‹E‹M ‹… Þ#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅhß#häÞ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹… Þ#ƒÀDŽ€R‰ÐÁà)ÐfÇÅhß#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅhß#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhô‹"ÿuìÿuèÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ â#eô[^_]ÐU‰åƒìÿ5lÞ#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5lÞ#jèñãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèÙãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèÁãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè©ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèyãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèaãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèIãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè1ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºDß#‹‹4… Þ#¿@ß#fÇD(€‹„Ћ–ðÂPQè9™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì hà2#è
+Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µ Þ#ƒÄ jhx2#Sè®[fÇCÆCÇC "ÇCԍ"ÇC à"ÇC$Ž"ÇC(ÇC, Ž"ÇC0,Ž"ÇC44Ž"ÇC8@Ž"ÇC<HŽ"ÇC@dŽ"ÇCDŒŽ"ÇCH´Ž"ÇCL܎"ÇCP"ÇCT,"ÇCXT"ÇC\|"ÇC`¨"ÇCdЏ"ÇChø"ÇCl "ÇCpH"ÇCtp"ÇCx˜"ÇC|À"ǃ€è"ǃ„‘"ǃˆÿÿÿÿÇ$ƒ2#èô¿ÿÿƒÄ jVh8‘"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹ Þ#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹… Þ#ÿ°ˆhå1#èìYƒÄÉÍvU‰å‹E‹… Þ#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕhß#]ÃU‰åƒìhô1#èxYƒÄÿ5lÞ#j è„àÿÿƒÄÉÍvU‰åƒìhû1#èPYƒÄÿ5lÞ#j è\àÿÿƒÄÉÍvU‰åƒìh2#è(YƒÄÿ5lÞ#j è4àÿÿƒÄÉÍvU‰åƒìh 2#èYƒÄÿ5lÞ#j è àÿÿƒÄÉÍvU‰åƒìh2#èØXƒÄÿ5lÞ#j èäßÿÿƒÄÉÍvU‰åƒìh2#è°XƒÄÿ5lÞ#j è¼ßÿÿƒÄÉÍvU‰åƒìh2#èˆXƒÄÿ5lÞ#j è”ßÿÿƒÄÉÍvU‰åƒìh%2#è`XƒÄÿ5lÞ#jèlßÿÿ¸ƒÄÉÉöU‰åƒìh,2#è4XƒÄÿ5lÞ#jè@ßÿÿƒÄÉÍvU‰åƒìh32#è XƒÄÿ5lÞ#jèßÿÿƒÄÉÍvU‰åƒìh:2#èäWƒÄÿ5lÞ#jèðÞÿÿƒÄÉÍvU‰åƒìhA2#è¼WƒÄÿ5lÞ#jèÈÞÿÿƒÄÉÍvU‰åƒìhH2#è”WƒÄÿ5lÞ#jè ÞÿÿƒÄÉÍvU‰åƒìhO2#èlWƒÄÿ5lÞ#jèxÞÿÿƒÄÉÍvU‰åƒìhV2#èDWƒÄÿ5lÞ#jèPÞÿÿƒÄÉÍvU‰åƒìh]2#èWƒÄÿ5lÞ#jè(ÞÿÿƒÄÉÍvU‰åƒìhd2#èôVƒÄÿ5lÞ#jèÞÿÿƒÄÉÍvU‰åƒìhk2#èÌVƒÄÿ5lÞ#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPhđ"hr2#趜ÿÿƒÄ ‹ Þ#‰Ã‰šˆƒûÿuƒì h 2#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅxß#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàºà #€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…ä #éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹°Á#ƒúÿtqÕ)Ѝ<…w‹†ä #£°Á#ƒì ÿuèV@‰$臹ÿÿ»à #‰ƒÄÿuPè7U‹Eð‰‡è #‡ì #‰$è(‘ÆDƒÄû‡ä #ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»à #vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾à #ÿ43è%¹ÿÿƒÃÆD3¡°Á#‰ƒä #‰=°Á#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…ø #uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ4…à #ƒ~ ÿu
+ƒ~…“ƒìWjÿlZ#ƒÄh$ß#jè8)ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë!‰ö¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qèú›ÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRH‹ +lÞ#I‰ÐÁà)л@ß#fÇDÃ(Íǂà¼#‹‰‚ä¼#ƒÄF PQ辏ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèõÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…ø #uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ4…à #…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿlZ#ƒÄh$ß#jèš&ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qè^™ÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ +lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRH‹ +lÞ#I‰ÐÁà)л@ß#fÇDÃ(͋E ‰‚à¼#‹‰‚ä¼#ƒÄF PQè#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèZ›ÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…ø #uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…à #‹JA‰J‹Z ƒûÿtG‹Ýà¼#9È<)Á‰È‰BƒìB PSèƊ[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPDèÿÿƒÄƒìWjÿlZ#ƒÄ‰ðPé¼‰öúèª<‹€Þ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ…à #‹JA‰J‹Z ƒûÿtG‹Ýà¼#9È<)Á‰È‰BƒìB PSè&Š[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD荙ÿÿƒÄƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…ø #uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…à #^‹^ ƒûÿts݉‹€à¼#;F_¿à¼#ÇEðv‹F+:‰FƒìF PS艍[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿlZ#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹€Þ#R‰ÑÁá)Ñf‰ÍHß#‹E‹Õ)Ѝ4…à #^‹^ ƒûÿtr݉‹€à¼#;F^¿à¼#ÇEð‰ö‹F+:‰FƒìF PSè.ˆ[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿlZ#ƒÄƒ}ðtèd—ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿ä #õ)óÁãǃà #‰4;ǃè #ƒì ƒì #PèB‡ƒÃF‰;ƃè #ƒÄ‰Æþÿ~±Çؼ#ÿÿÿÿÇ°Á#ƒìjhx "è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…ø #uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)лà #ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћ°Á#‰…ô #‹£°Á#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…ø #uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…ì #ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…ø #‹Õ)Ћ°Á#‰…ô #‹£°Á#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…ø #uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸ì #ÿu ‹€è #‰ë7‰öÇ‹Õ)Ћ…ì #¹Hß#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹°Á#‰ƒúÿtnÕ)Ћ…ô #£°Á#‹Õ)лà #ǃ‹Õ)Љ …è #ƒì ‹Õ)Ѝ…ì #P聄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…ø #uèaǸÿÿÿÿë=ú‹Õ)Ѝ…à #ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<Õhß#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾hß#uAƒì‹Ýä¼#Õ)Ѝ…ì #PS考‹†Dß#ƒÄ‹… Þ#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=xZ#…ÚÇxZ#¹»¥%¾¥%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjhÀÁ#èÜýÿÿ¹ƒÄ¾d§%»`§%‰ö‰ÁàQ‰0Ɖуù +véÇ”©%ÿÿÿÿƐ©%ÇX§%¹¾Ä©%»À©%vÍ)ÈÁàQ‰0ƉуùvãÇð¬%ÿÿÿÿÆì¬%Ç­%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=X§%ÿuèí^ǍûÇEìÿÿÿÿ됡X§%€‹Õd§%‰X§%û‰Eìƒ}ìÿu +¸ÿÿÿÿéìvƒì hÀÁ#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å ¥%t0ƒìÿu¿ōƒ¥%Pè³EƒÄ…Àu€»¥%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ ¥%ƒìÿuƒ¥%Pè÷D‹E쉃¥%ƒÄ€}óu‰Â’‹] f‰Åh§%ëv‹E썀‹E ¯Ef‰Õh§%úƒì ‹U썒Áã·ƒh§%Pèݨÿÿºl§%‰ƒÄû…Àu%è”]ǒƒì hÀÁ#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾`§%‹ƒl§%‰‚d§%‰2ƒìjjƒ|§%Pè:ûÿÿƒÄ ·D3Pjƒ€§%Pè#ûÿÿƒÄ jjÃ„§%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=­%ÿuèø\ǎûÇEèÿÿÿÿë¡­%Å)‹•Ä©%‰­%û‰Eèƒ}èÿu_ƒì hÀÁ#èvôÿÿ‹Eèéä‰öè§\ǐƒì hÀÁ#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì hÀÁ#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹À©%ŠUòˆT P‹]ì‰
+‹] f‰\
+ǀĩ%ÿÿÿÿ‰ºÈ©%‹]썛ÆÕ`§%ƍ¿ōr¿¥%€|>t%ƒì¶D>Pš¥%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì hÀÁ#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=­%ÿuèa[ǎûÇEìÿÿÿÿë ¡­%Å)‹•Ä©%‰­%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàºÀ©%ˆ\ ‹M f‰Lǀĩ%ÿÿÿÿƒì hÀÁ#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å ¥%u ¿ÆEçë8ƒìÿu¶Å¥%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸥%ÆD ÆDƒìÿuPè>AƒÄ jjÃ¥%Sè/øÿÿÇ$ÀÁ#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº¥%€|t'þDƒì hÀÁ#è®ñÿÿƒÄ jjƒ¥%Pèûîÿÿ됃ì hÀÁ#è‹ñÿÿƒÄ¶‹<Å¥%¿ŠUó:Åx§%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·Åh§%9E u€}ót(¿·Åh§%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì hÀÁ#è ìÿÿ¶‹Å$¥%ƒÄƒúÿ„­€}óu#è&YǕƒì hÀÁ#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…Ô©%9E t"èíXǔƒì hÀÁ#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »¥%‹‰Ä©%‹Mì‰ ë/‰öèŸXǑƒì hÀÁ#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰Å$¥%ƒì hÀÁ#è*ðÿÿ‹EìÁà+EìÁàH‰±È©%ºÀ©%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗À©%‰UðhÀÁ#èÏêÿÿ‹Mð‹Y›ÁãC‰E躥%‹€Áà°`§%ƀ`§%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹¥%‹Eè‹ú ’¡X§%‰Íd§%‰X§%ûƇÀ©%ƒÃ ‹Uð‹B‰ƒ¥%ú¡­%‰‡Ä©%‹Mì‰ +­%ûƃ¥%Ç$ÀÁ#è
+ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…À©%‰Eð‹@€Å`§%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…À©%‰Eð‹@€Å`§%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìhÿ2#è;ƒÄÿ5X§%h 3#è;»ƒÄÝ)ØÁà€¸À©%t8À©%‹B€Å`§%ƒì ÿp ÿp$‹B€Å¥%PSh3#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…Щ%’Å`§%ÿp ÿp$RQh@3#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]hÀÁ#èHæÿÿ¿ÓÕ)Ѝ …‹Ø©%€Å ƒÄ€º¥%u ‹Ä©%‰‚¥%¿ÃÅ)ÂÁâƂÀ©%ú‹ +­%‰ŠÄ©%£­%ûƒì hÀÁ#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…ß#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;lÞ#u û¸#é~ƒ;ÿtc¾@ß#‰ö‹ +lÞ#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡lÞ#‰CÿCè…ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡lÞ#ÿD‡D¡lÞ#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;lÞ#tû¸髍vúè*'‹lÞ# [‰ÊÁâ)Êf‰ÕHß#‹E‹…ß#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉŐß#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h¤3#è~ÿÿè +™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µß#ƒÄ jh¸3#Sè"8fÇCÍÆCÇCÇC¸°"ÇC ±"ÇC$±"ÇC(±"ÇC,H±"ÇC0t±"ÇC4¼±"ÇC8®"ÇC<²"ÇC@¯"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…ß#ƒì h€3#è7¾ƒÄƒÃƒìÿt³@hŸ3#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…ß#ƒÀƒ|@tƒìRj
+èȽÿÿƒÄÉÍvU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+û¸ë"‰ö¡lÞ#‹½ß#ƒÂÿD‚@¡lÞ#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•ß#ú‹p¸…ö„V‹;lÞ#u û¸#éA‹lÞ#‹F ¿@ß#;„“°v +¸é v¡lÞ#‹Œƒ°‹“¬…Òt‰ö‹;lÞ#…Š‹R…Òu븅À…†‹ +lÞ#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡lÞ#‰B‹ƒ¬ÿ@èj€ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…ß#¡lÞ#ÿDƒD¡lÞ#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ß#ú‹X¸…Û„Ù‹;lÞ#uû¸#éčv‹lÞ#‹C ;„‘°s
+¸饡lÞ#‹´°‹‘¬…Òt‰ö‹;lÞ#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½ß#¡lÞ#ÿDD¡lÞ#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;lÞ#tû¸éڍvúè&!‹lÞ# [‰ÊÁâ)Êf‰ÕHß#‹E‹…ß#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉŐß#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu +‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hä3#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4ß#ƒÄ jhø3#Vèî1fÇFÌÆFÇFÇFÀ·"ÇF D¸"ÇF$p¸"ÇF( ¸"ÇF,è¸"ÇF0¹"ÇF4l¹"ÇF8|²"ÇF<´"ÇF@µ"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…ß#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…ß#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…ß#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…ß#h€3#è0»ƒÄwƒìÿtž@hŸ3#èó/ƒÄCû™~ãƒì hÂ3#èÚ/»ƒÄ‰öƒìÿ´Ÿ°hÞ3#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …ß#Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹…ß#ƒ|³DtƒìVj
+èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh4#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿À¹%ÿt8CP‰Eä·8Ph 4#èá-ƒÄ ÿt;·D;Ph4#èÊ-ƒÄ ÿt; s·>Ph(4#è±-ƒÄ ÿt>·D>Ph94#èš-ƒÄ ‹Uä·D:P·DLPhJ4#è~-‹UèÕƒÄ·ØSh[4#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh 4#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º <&fƒ= <&yA¿Áfƒ<Byfù™~îfù™~ƒì hp4#èÎ,¸ƒÄé ¿Á<¹ <&‰Úf Ê€f‰Ǎ<ÿÁçºÀ¹%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇ,º%¾à=&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹À¹%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ <&]ÉöU‰åSƒì‹]¿E Phˆ4#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìh¬Ã"SèƒÄh8½"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹|Z#€82uºð°îƒìShâ5#èˆ*ƒÄÁ㋃|Z#@Ph=@#èp*ƒÄÿ³ÀZ#ènƒÄ‹]üÉÉöU‰åƒìÿuhù5#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=¸%„à…ÿ„Ø¡€®%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡„®%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡„®%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]血®%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=t®%…Ρx®%€€€€€€‰ÃÁã‹ +|®%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡x®%‰¡|®%éqvƒø…ç¶d®%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +p®%f)Ù·É +€®%º×®¬]‰È÷êÁú‰ÈÁø)„®%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£€®%f‰p®%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡„®%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹€®%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+‰ð™‰È)Ћ +„®%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=t®%…rUè¡x®%‰¡|®%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð·¸%9Æv%h6#j_h6#h6#èm%Ç$èmƒÄ·¸%)ó¯h®%·¸%‰Ø‰Ñº÷ñ‰Ãº °
+îì©t‹ +h®%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡x®%€€€€€€Áà‰Eä‹ +|®%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ([#ƒ=([#uƒ=[#tÿ[#¶E÷€Áàº,­%ƒ<uIÇö€0­%tûƒì ¶]÷›Áã¾ ­%ÿ43ÿ“$­%ƒÄöDtú¶E÷€Ç…,­%ÿ [#ƒ=([#uƒ=[#tÿ[#ÿ +([#eø[^]ÍvU‰åWVSº¿,­%¾(­%»$­%¹ ­%’ÁàÇ8‰0ÇÇBƒú~ÜÇ([#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…,­%t÷Æu¸ÿÿÿÿëH’ …ǁ,­%û…Ût‰™$­%º ­%(­%‰‰t
+됍’Ç…,­%¸[^]ÐU‰å¡([#]ÉöU‰åSƒì¶d®%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +p®%f)Ù·É +€®%º×®¬]‰È÷êÁú‰ÈÁø)„®%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ +€®%f‰p®%ÿ([#ƒ=([#uƒ=[#tÿ[#¡|®%‰ÃÄÁ#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êx®%’’’’’’’’’Á⠉Ø)У|®%‹`®%ë$‹¡l®%‰‰l®%‰`®%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;x®%;x®%uƋB;|®%~»ƒ=([#uƒ=[#tÿ[#ÿ +([#‹]üÉÃU‰åWVSƒì‹uhÒ"j@èØ +ƒÄƒ>t,ƒì h96#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hU6#è³ ‹N‰ +h®%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ +¸%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£t®%ƒ=d>&~»A¹C°p‰ÊÚîîÆd®%ë%Æd®%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ ®%»¤®%ƒùbIÁà¸®%‰0I‰LÃAƒùc~ßÇè·%Çl®% ®%Ç[#Ç[#¡h®%€€€Áà£ÄÁ#Ç|®%Çx®%Ç€®%Ç„®%fÇp®%ƒ=t®%uÇDÞ#øÈ"ÇHÞ#É"ëÇDÞ#àÉ"ÇHÞ#lÐ"eô[^_]ÃU‰å‹E£[#]ÍvU‰å‹E£[#]ÍvU‰å‹E£[#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=l®%tl‹ +l®%‹£l®%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹`®%}è‹uè됋…Òt‰ð;B  +;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ +`®%‰‹AƒÄ [^_]ÐU‰å‹E¹‹`®%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+‹£`®%됋‰¡l®%‰‰l®%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=l®%„q‹5l®%‹£l®%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹`®%}è‹Mè됋…Ût‰È;C  +;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5`®%ƒ=¸%…ôƒìEàPjè3óÿÿ‹`®%ƒÄ‹Eà;B  +;B u‹Eä;B~ÇEÜÇEØëK}؋`®%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡`®%‹@ +EàH‰EØ¡`®%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶d®%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹p®%f)Ú·Ò‰Ö5€®%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +„®%‰AÁà)ȍÁ‰ÁÁá ȉò)‰€®%f‰p®%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=`®%„/Ǹ%‹`®%‹Eè;B ;B …Œ‹C;BŽ€ƒ=([#uƒ=[#tÿ[#ÿ([#‹`®%ë#‹¡l®%‰‰l®%‰`®%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè +;EèűB;Eì~ă=([#uƒ=[#tÿ[#ÿ +([#¶d®%ƒøt"ƒø …Àt +ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹p®%f)Ú·Ò‰Ö5€®%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +„®%‰AÁà)ȍÁ‰ÁÁá ȉò)‰€®%f‰p®%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹`®%‹Mè;J 
+;J u;B~ÇEäÇEàëJ]à‹`®%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡`®%‹@ +EèH‰Eà¡`®%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîǸ%ë +‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹`®%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£`®%»ë‹‰¡l®%‰‰l®%ƒ=¸%…ƒ=`®%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹`®%ƒÄ‹Eð;B  +;B u‹Eô;B~ÇEìÇEèëJ]è‹`®%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡`®%‹@ +EðH‰Eè¡`®%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼ÈÑ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡[#@£[#1ÛfŒÓü¡t®%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡[#f9[#t f£[#ÿ-[#ƒ=[#t‹[#ÿÓf©f¡ffaωöU‰å‹EØf£[#f£[#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;[#t f£[#ÿ-[#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡ØX#]ÉöU‰å]ÍvU‰åSƒì‹ØX#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=ÊX#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèÊX#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹à[#fÇD
+8Ƃå[#îƂä[#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+$[#ë7fƒùw<·Éƒé¸Óà
+%[#¢%[#º¡î<ÿu $[#©uƒÈ¢$[#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"$[#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"%[#¢%[#º¡î $[#©t%û¢$[#º!î]ÉöU‰å¿[#]ÃU‰åƒì‹Ef£[#˜PèWüÿÿƒÄÉÐU‰å¿[#]ÃU‰åƒì‹E‰Âf£[#ƒ=([#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹0[#ºp[#‰öµÇ(Ú"Ç(Ú"Fƒþ~åƒì EÈPèÅèºÇ`>&¡6#‹EÈ£d>&¶,[#£h>&ƒÄ‹EУp>&‹EÔ£t>&‹EØ£x>&hÑÛ"jè£ýÿÿƒÄhÛÛ"jè”ýÿÿƒÄhåÛ"jè…ýÿÿƒÄhìÛ"jèvýÿÿƒÄhóÛ"jègýÿÿƒÄhúÛ"jèXýÿÿƒÄhÜ"jèIýÿÿƒÄhGÜ"jè:ýÿÿƒÄhÜ"jè+ýÿÿƒÄhÜ"j èýÿÿƒÄhÜ"j
+è +ýÿÿƒÄhÜ"j èþüÿÿƒÄh$Ü"j èïüÿÿƒÄh+Ü"j +èàüÿÿƒÄh2Ü"jèÑüÿÿƒÄh9Ü"jèÂüÿÿƒÄh@Ü"jè³üÿÿƒÄhÛ"jAè¤üÿÿƒÄhÛ"jBè•üÿÿƒÄhÛ"jCè†üÿÿƒÄhÛ"jDèwüÿÿƒÄh Û"jEèhüÿÿƒÄh(Û"jFèYüÿÿƒÄh0Û"jGèJüÿÿƒÄh8Û"jpè;üÿÿƒÄh@Û"jqè,üÿÿƒÄhHÛ"jrèüÿÿƒÄhPÛ"jsèüÿÿƒÄhXÛ"jtèÿûÿÿƒÄh`Û"juèðûÿÿƒÄhhÛ"jvèáûÿÿƒÄhpÛ"jwèÒûÿÿf +Ô=&€¾ƒÄvÀÅÀ¹%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿à=&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=d>&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•p[#]ÉöU‰å‹U‹E ‰•0[#]ÉöU‰åƒìh€6#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃÆ,[#Ûã¹âþfÇ.[#ZZÝ=.[#¹âþf¡.[#<u+Ù=.[#¹âþf¡.[#f%?fƒø?uÆ,[#Æ,[#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë(`¸ ë `¸ ë`¸ +ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…0[#ÿÓ[° ƒûrº îº îf¡[#f;[#t f£[#ÿ-[#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ëI¸ ëB¸ ë;¸ +ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=ÊX#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…p[#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿°[#È·À-yƒÀÁø9ÂtU¿°[#@ÀÝ4Å,º%›È·À-yƒÀÁøf£°[#¿5°[#¿ >&4v4ö4õ,º%¹üó¥Ý% >&^_]ÉöU‰å¿°[#]ÃU‰åWVSƒì(ŠM¡´[#Áà ˜€ f¶?&f£ÊÑ#f¶ +?&f£ÌÑ#€ù t%€ù €ù„óé‰ö€ù
+„#é‰öfƒÊÑ#·ÊÑ#;?&Œ½fÇÊÑ#·ÌÑ#¡?&H9Â…¿¡?&H‰Eì‰Uèf¾ ?&Áâf‰Uò¡´[#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯?&Èf‹]òf‰FA;Mì~çé)‰öfÇÈÑ#·ÊÑ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰ÈÑ#f¡ÈÑ#f£ÊÑ#éævfÇÊÑ#·ÌÑ#¡?&H9Â…¾¡?&H‰Eà‰UÜf¾ ?&Áâf‰Uæ¡´[#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯?&Èf‹]æf‰FA;Mà~çé%‰öfÿ +ÊÑ#·ÊÑ#·ÌÑ#¯?&ÂÆS fÿÊÑ#éõ‰ö·ÊÑ#·ÌÑ#¯?&Ј CfÿÊÑ#·ÊÑ#;?&Ž¿fÇÊÑ#·ÌÑ#¡?&H9Â…š¡?&H‰EԉUÐf¾ ?&Áâf‰UÚ¡´[#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯?&Èf‹]Úf‰FA;MÔ~çëfÿÌÑ#·5ÊÑ#·=ÌÑ#‰øf¯?&f‰EΡ´[#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ?&‰ø¢ +?&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯?&f‰Eò¡´[#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢?&‰úˆ +?&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡´[#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯?&È·G‰ð¯?&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯?&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡?&H‰Eð‹?&K‰]ìf¾ ?&Áàf‰Eê¡´[#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯?&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰?&¶„@£?&¶„ÿ ¢ ?&¶P¢?&¶Q¢ +?&¶`¢ÏÑ#¶a¢ÎÑ#Ǹ[#Ç´[#]ÃU‰åWVSƒì ?&¢P  +?&¢Q¶ÀP¶?&PèŠýÿÿ¶ÎÑ#¶5ÏÑ#ƒÄ¹Ô°
+‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £¸[#¹Ô° +‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹´[#Áâ»àÑ#¶?&‰¹Ò#¶ +?&‰
+µŠ¢?&Š
+¢ +?&‰5´[#[^]ÃU‰å¡¸[#]ÉöU‰å¡´[#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯?&¡´[#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢ +?&ŠE¢?&ƒÄeô[^_]ÍvU‰åWVSƒì ¡?&H‰Eð‹=?&Of¾ ?&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯?&¡´[#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ +?&Æ?&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯?&¡´[#Áà ÂU”€ ˆ
+ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯?&¡´[#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯?&¡´[#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh¼6#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh Ò#èX‰ÃÇ$ Ò#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh Ô#謉ÃÇ$ Ô#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë +¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$… '#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë +vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäj
+VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} +ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…p(#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$…À)#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhÈ6#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhÕ6#Wè¶öÿÿ‰ÇƒÄ EìPj
+됃ìhà6#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä +ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhø6#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} +‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì Sè± ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(Ý+#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý+#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ+#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý+#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý+#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E ¼[#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝ+#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝ7#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝ7#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5+#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ 7#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿÜ(7#Ü ++#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝ+#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ý7#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝ7#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf +? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh07#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh47#Qè çÿÿƒÄ¸ë‰ö…Étƒìh97#QèçÿÿƒÄ¸ÉÃU‰åƒì¸ Ö#ƒ=È[#tÿÈ[#ÉÃU‰å‹E£È[#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=Ì[#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•0+#ÝØÇEغ>7#ƒøc~ºC7#‰UÜÇEðÇEôƒ=Ì[#„}ƒì EØP誃ąÀ…uƒ=Ì[#…YƒìjhI7#éëvÝØÇEغ]7#ƒøc~ºb7#‰UÜÇEðÇEôƒ=Ì[#„ƒì EØPè>ƒÄ…À… ƒ=Ì[#…íƒìjhh7#év‰]à‰uäÝ]èÇEغ|7#ƒøc~º‚7#‰UÜÇEðÇEôƒ=Ì[#„žƒì EØPè˃ąÀ…–ƒ=Ì[#…zƒìjh‰7#é ÝØÇEغž7#ƒøc~º¤7#‰U܃=Ì[#uÇEðàÇEôÿÿïGé¸ +¡À[#‹Ä[#‰Eð‰Uôé¡ +‰öÝØÇEغ29#ƒøc~º89#‰U܃=Ì[#uÇEðàÇEôÿÿïGéh +¡À[#‹Ä[#‰Eð‰UôéQ +‰öÝØÇEغ«7#ƒøc~º¯7#‰U܃=Ì[#uÇEðàÇEôÿÿïGé +¡À[#‹Ä[#‰Eð‰Uôé +‰öÝØÇEغ«7#ƒøc~º¯7#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ72#ƒøc~º´7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„óƒì EØPè ƒÄ…À…ëƒ=Ì[#…σìjh¸7#éaÝØÇEغ72#ƒøc~º´7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„gƒì EØP蔃ąÀ…_ƒ=Ì[#…Cƒìjh¸7#éÕ +ÝØÇEغø1#ƒøc~ºÊ7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„Û +ƒì EØPèƒÄ…À…Ó +ƒ=Ì[#…· +ƒìjhÎ7#éI +ÝØÇEغø1#ƒøc~ºÊ7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„O +ƒì EØPè| +ƒÄ…À…G +ƒ=Ì[#…+ +ƒìjhÎ7#é½ ÝØÇEغà7#ƒøc~ºã7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„à ƒì EØPèð ƒÄ…À…» ƒ=Ì[#…Ÿ ƒìjhç7#é1 ÝØÇEغà7#ƒøc~ºã7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„7 ƒì EØPèd ƒÄ…À…/ ƒ=Ì[#… ƒìjhç7#é¥ ÝØÇEغù7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGéP ¡À[#‹Ä[#‰Eð‰Uôé9 ‰öÝØÇEغù7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=Ì[#…= ƒìjh8#éÏ
+vÝØÇEغ8#ƒøc~º 8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=Ì[#…¯
+ƒìjh%8#éA
+ÝØÇEغ8#ƒøc~º 8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=Ì[#…#
+ƒìjh68#éµ ÝØÇEغI8#ƒøc~ºO8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„Íƒì EØPèè ƒÄ…À…³ ƒ=Ì[#…— ƒìjhV8#é) ÝØÇEغI8#ƒøc~ºO8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„/ ƒì EØPè\ ƒÄ…À…' ƒ=Ì[#… ƒìjhi8#靐ÝØÇEغ~8#ƒøc~º‚8#‰UÜÇEðÇEôƒ=Ì[#… ƒì EØPèòƒÄ…À…½ƒìjh‡8#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ +è9#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡À[#‹Ä[#‰Eð‰Uô‰]ЉuÔÝEÐÜ +è9#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡À[#‹Ä[#ò€‰Eð‰UôéòvÝØÇEغ~8#ƒøc~º‚8#‰UÜÇEðÇEôéÁ‰öÝØÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uÇEðÇEôë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„ãƒì EØPèƒÄ…À…Ûƒ=Ì[#…¿ƒìjhŸ8#éQÝØÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uÇEðÇEôëÇEðÇEôøƒ=Ì[#„`ƒì EØP荃ąÀ…Xƒ=Ì[#…<ƒìj hÀ9#éΉöÇEغ¹8#ƒøc~º¾8#‰U܃=Ì[#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ +À[#‹Ä[#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغÄ8#ƒøc~ºÉ8#‰U܃=Ì[#uÇEðÇEôëÇEðÇEôøƒ=Ì[#„Lƒì EØPèyƒÄ…À…Dƒ=Ì[#…(ƒìjhÏ8#麉öÇEغã8#ƒøc~ºè8#‰U܃=Ì[#uÝ]ðëÝØÇEðÇEôøƒ=Ì[#„Òƒì EØPèÿƒÄ…À…ʃ=Ì[#…®ƒìjhî8#é@ÝØÇEغ9#ƒøc~º +9#‰UÜÇEðÇEôøƒ=Ì[#„iƒì EØP薃ąÀ…aƒ=Ì[#…Eƒìjh9#é׍vÝØÇEغ19#ƒøc~º79#‰UÜÇEðÇEôøƒ=Ì[#„ýƒì EØPè*ƒÄ…À…õƒ=Ì[#…Ùƒìjh>9#ékvÝØÇEغS9#ƒøc~ºY9#‰UÜÇEðÇEôøƒ=Ì[#„‘ƒì EØP较ąÀ…‰ƒ=Ì[#…mƒìjh`9#éÿvÇEغS9#ƒøc~ºY9#‰UÜÜ5ð9#Ý]ðƒ=Ì[#„,ƒì EØPèYƒÄ…À…$ƒ=Ì[#…ƒìjhu9#隉öÇEغˆ9#ƒøc~ºŽ9#‰U܋ +À[#‹Ä[#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغˆ9#ƒøc~ºŽ9#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=Ì[#…jé|vÝØÇEغ•9#ƒøcŽ•º˜9#鋍vÝØÇEغ72#ƒøc~uº´7#ën‰öÝØÇEغ«9#ƒøc~Yº®9#ëR‰öÝØÇEغø1#ƒøc~=ºÊ7#ë6‰öÝØÇEغ²9#ƒøc~!ºµ9#ë‰öÝØÇEغà7#ƒøc~ºã7#‰UÜÇEðÇEôƒ=Ì[#„¯ƒì EØPèʃąÀ…•ƒ=Ì[#…‹ƒìjÿuÜjè«îÿÿƒÄ jhœ9#jèšîÿÿƒÄëfÝØÇEغú7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغú7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#„‰ƒì EØP趃Ä…À…ƒ=Ì[#uiƒìjh 8#jè™íÿÿƒÄëSÇEغ~8#ƒøc~º‚8#‰UÜÝ]ðƒ=Ì[#ÿt ƒ=Ì[#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhø9#h:#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hø9#h +:#è` ƒÄöCtƒìjahø9#h@:#èC ƒÄöC tƒìjbhø9#h€:#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhø9#h!:#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh°:#h»:#èX ƒÄ‹F ;Cv‹F;C sƒìjmh°:#hà:#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh +;#h;#èÙ
+ƒÄ…ÿuƒìjMh +;#h;#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh +;#h`;#è€
+ƒÄƒ~t‹F;F rƒìjUh +;#hÀ;#è[
+ƒÄ‹F +F9FvƒìjUh +;#h<#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h +;#h@<#èø ƒÄöCtƒìj_h +;#h€<#èÛ ƒÄƒ;t9wƒìj`h +;#hÀ<#è» ƒÄ;^ rƒìjah +;#h6;#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwh +;#hM;#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThé<#h;#èۃă} uƒìjUhé<#h;#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hé<#h`;#舃ăt‹G;G rƒìj[hé<#hÀ;#ècƒÄ‹G +G9Gvƒìj[hé<#h<#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkhé<#h@<#èèƒÄöCtƒìjlhé<#h€<#è˃ă;t9wƒìjmhé<#hÀ<#諃Ä;_ rƒìjnhé<#h6;#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hé<#hô<#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hé<#h =#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´hé<#hM;#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShR=#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvhà=#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjahd=#h`;#袃ă~t‹F;F rƒìjahd=#hÀ;#è}ƒÄ‹F +F9Fvƒìjahd=#h<#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh >#è—ËÿÿƒÄ ÷Ãtƒìjihd=#h@<#èƒÄöCtƒìjjhd=#h`>#èóƒÄƒ{wƒìjkhd=#hk=#èփă;t9wƒìjlhd=#hÀ<#趃Ä;^ rƒìjmhd=#h6;#蚃Ä{‹…Û…BÿÿÿƒìWh‡=#èäÊÿÿƒÄ9~tƒìjshd=#hš=#è`ƒÄ‹6…ö…cþÿÿƒì h²=#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNhû9#h;#è ƒÄ…ÛuƒìjOhû9#h’>#èñƒÄƒ}uƒìjPhû9#h;#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXhû9#h>#螃ă{uƒ{t‹C;CsƒìjYhû9#h`;#èsƒÄƒ{t‹C;C rƒìjYhû9#hÀ;#èNƒÄ‹C +C9CvƒìjYhû9#h<#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbhû9#h<#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnhû9#hÀ>#諃ąöt8‹U:9ðr.9ðtƒìjuhû9#h?#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h&?#h`;#蠃ă~t‹F;F rƒìj]h&?#hÀ;#è{ƒÄ‹F +F9Fvƒìj]h&?#h<#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh&?#h@<#è$ƒÄöCtƒìjeh&?#h`>#èƒÄƒ{wƒìjfh&?#hk=#èêƒÄƒ;t9wƒìjgh&?#hÀ<#èʃÄ;^ rƒìjhh&?#h6;#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh&?#hš=#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh@?#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh@Ö#è…ÈÿÿƒÄh@Ö#ÿ5€Þ#jSVhÀ?#è5ƒÄ eø[^]ÍvU‰åƒìÿ5lÞ#jÿuÿu ÿuh€?#èƒÄ ÉÉöU‰åƒì E Pÿuh@Ú#èÈÿÿƒÄ jjhø!#èì%ÿÿƒÄh@Ú#h#@#èŠÅÿÿÇ$MèFÿÿƒÄÉÐU‰åƒìh@Ú#h@#ècÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лDß#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»Hß#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Řß#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹â#‰U苀â#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õâ#|[‰Eäv1‰ÐÁà)ЍÅ;šâ#u ‹Eì;‚â#|1‰Ï‰ÐÁà)Ћ Řß#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åâ#}«ƒÿÿt‰ÐÁà)ЋU‰Řß#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜Lß#¿Hß#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»Lß#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹՘ß#‰ƒøÿt@‰ÐÁà)ÐÇŜß#ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Řß#‹@‰ÂÁâ)‰ ՜ß#됉KI‰ÐÁà)ÐÇŘß#ÿÿÿÿI‰ÐÁà)ÐÇŜß#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰Ŝß#‹C@‰ÂÁâ)‰ ՘ß#ë‰ö‰ I‰ÐÁà)ÐÇŜß#ÿÿÿÿI‰ÐÁà)ÐÇŘß#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸A@#됸F@#됸J@#됸P@#됸1#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèL—ÿÿƒÄ ÿuìÿuèh`@#èeÁÿÿƒÄ÷EtN¾;5pÞ#sA¿ Þ#vƒì µ‹;¶BP·BPRVh @#è!ÁÿÿƒÄ‹;VÿP ƒÄF;5pÞ#rÇ÷Etƒì h{@#èõÀÿÿèX&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éö¨ê"pí"pí"pí"pí"pí"Üì"pí"èì"ôì"pí"í"í"í"í"í"í"í"í"í"í"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"´ê"Èê"4ì"ôë"tì"Ðì"Èê"pí"pí"Äì"pí"Ðì"pí"¬ë"pí"pí"Ìë"pí"ë"pí"pí"`ë"Tî"4ð"4ð"4ð"4ð"4ð"¬ï"4ð"¸ï"Àï"4ð"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"`î"tî"4ð"4ð"4ð" ï"tî"4ð"4ð"”ï"4ð" ï"4ð"4ð"4ð"4ð"lï"4ð"Äî"4ð"4ð"ï"@ó"Ló"Ló"Ló"Ló"Ló"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"@ñ"Äñ"Àò"Àò"Àò"4ó"Äñ"Ló"Ló"(ó"Ló"4ó"Ló"Ló"Ló"Ló"Xñ"Ló"4ò"Ló"Ló"Pò"$@$@¤##|#ì#<#Œ#Ü# #˜#$#°#<#È#T#¤#, #¸ #D
+#Ð
+#\ #Ð #ì # +#¨ +#,#¼#@#¸#$##ü#`#¬#ð##0#L#h#„##|##d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#¤##|#ì#<#Œ#Ü# #˜#$#°#<#È#T#¤#, #¸ #D
+#Ð
+#\ #Ð #ì # +#¨ +#,#¼#@#¸#$##ü#`#¬#ð##0#L#h#„##|##ONCE: (pid=%d)
+J (pid=%d) exits
+main: creating prova_key
+main: provakey =%d
+main: creating J1
+Error creating J1
+main: J1 has PID %d
+main: creating J2
+Error creating J2
+main: J2 has PID %d
+main: waiting 0.4 sec
+main: kill J1 and J2
+main: ending...
+J (pid=%d) destructor called with value %d
+J (pid=%d) printtest value=%d
+J (pid=%d) starts and call setspecific
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ +Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+8Œÿÿ’ÏÿÿšÏÿÈP#ÿà[#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#ìX#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­0#¦0#Ÿ0#˜0#‘0#Š0#ƒ0#|0#èz"ðz"ðz"Ó5#Æ5#¸5#§5#Œ5#v5#f5#R5#C5#35#&5#5#5#æ4#Ú4#35#Ç4#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš7#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€'! '# '¨ )ÈP#HA /Ð[#`L5à[#`L8ã :`LLC¬]hdI
\ No newline at end of file
/branches/pj/pse51/ptest2
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest2.c
===================================================================
--- branches/pj/pse51/ptest2.c (nonexistent)
+++ branches/pj/pse51/ptest2.c (revision 1085)
@@ -0,0 +1,152 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest2.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 2:
+
+ pthread_once + thread_specific_data
+
+ the main task:
+ creates a key
+ creates 2 tasks, J1, J2
+ at t = 0.4 sec. it kills J1 and J2
+
+ J1 and J2 will set and check the thread specific data
+ and when the die, a destructor is called (twice, because the value
+ is not set to null...)
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+pthread_key_t prova_key;
+
+pthread_once_t once = PTHREAD_ONCE_INIT;
+
+void once_init()
+{
+ cprintf("ONCE: (pid=%d)\n", exec_shadow);
+}
+
+void destr_key(void *arg)
+{
+ cprintf("J (pid=%d) destructor called with value %d\n", exec_shadow,(int)arg);
+ pthread_setspecific(prova_key,(void *)((int)arg/100));
+}
+
+void print_test()
+{
+ int val;
+
+ val = (int)pthread_getspecific(prova_key);
+ cprintf("J (pid=%d) printtest value=%d\n", exec_shadow, val);
+}
+
+void *J(void *arg)
+{
+ pthread_once(&once, once_init);
+ cprintf("J (pid=%d) starts and call setspecific\n", exec_shadow);
+ pthread_setspecific(prova_key,arg);
+ print_test();
+ cprintf("J (pid=%d) exits\n", exec_shadow);
+
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ int err;
+ pthread_t j1, j2;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+
+ cprintf("main: creating prova_key\n");
+ pthread_key_create(&prova_key, destr_key);
+
+ cprintf("main: provakey =%d\n", prova_key);
+
+ cprintf("main: creating J1\n");
+ err = pthread_create(&j1, NULL, J, (void *)1414);
+ if (err) cprintf("Error creating J1\n");
+ cprintf("main: J1 has PID %d\n",j1);
+
+ cprintf("main: creating J2\n");
+ err = pthread_create(&j2, NULL, J, (void *)3141);
+ if (err) cprintf("Error creating J2\n");
+ cprintf("main: J2 has PID %d\n",j2);
+
+ cprintf("main: waiting 0.4 sec\n");
+ while (sys_gettime(NULL) < 400000);
+
+ cprintf("main: kill J1 and J2\n");
+ pthread_cancel(j1);
+ pthread_cancel(j2);
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/ptest3
===================================================================
--- branches/pj/pse51/ptest3 (nonexistent)
+++ branches/pj/pse51/ptest3 (revision 1085)
@@ -0,0 +1,423 @@
+ELF"4Àg4 ( €""(D(D ¨D(T#(T# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸@é"fe£HT#Áèfe£NT#(\#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼@‡#ǽ%@g#ǽ%@‡#£4\#‰8\#(\#êµ"8.\#üèNÕê U‰å‹Eê ‰öU‰åSìüƅÿÿÿxƅÿÿÿ-ƅÿÿÿht"ƒì‹…ÿÿÿf‰$ÆD$-èÅÇE´"ÇE°]¨E¬‰$è9nƒÄ jSjè$YƒÄ jSjèYÇEˆÇEŒÇE+DžhÿÿÿDžlÿÿÿDžpÿÿÿšDžHÿÿÿDžPÿÿÿ DžTÿÿÿ„"…(ÿÿÿ‰…XÿÿÿƒÄ Dž(ÿÿÿDž,ÿÿÿDž8ÿÿÿDž<ÿÿÿDž@ÿÿÿDž0ÿÿÿDž4ÿÿÿ
+ÇEèÇEìeÍÇEðÇEôÇEØÇEÜÂë ÇEàÇEäÇEÈÇEÌ£áÇEÐÇEÔÇEÄÇEÀÇE¼ÇE¸…ÿÿÿPEˆPjèWqƒÄƒøÿuƒì h`1#èVçƒÄƒì…ÿÿÿP…hÿÿÿPjè'qƒÄƒøÿuƒì h€1#è&çƒÄƒì… ÿÿÿP…HÿÿÿPjè÷pƒÄƒøÿuƒì h 1#èöæƒÄjEèPjÿµÿÿÿè€uƒÄƒøÿuƒì hÜ/#èËæƒÄjEØPjÿµÿÿÿèUuƒÄƒøÿuƒì hù/#è æƒÄjEÈPjÿµ ÿÿÿè*uƒÄƒøÿuƒì h0#èuæƒÄƒì h30#èeæƒÄ‰öƒì jè2=ƒÄ=³vìƒì hM0#è?æEØPE¸PjÿµÿÿÿèÊtƒÄ ƒøÿuƒì hÀ1#èæƒÄƒì‹MäºÓMb‰È÷êÁú‰ÈÁø)ÂRÿuàhà1#èëåƒÄƒì jèº<ƒÄ=–˜vìƒì hf0#èÇåEèPE¸PjÿµÿÿÿèRtƒÄ ƒøÿuƒì h 2#èåƒÄƒì‹MôºÓMb‰È÷êÁú‰ÈÁø)ÂRÿuðh@2#èsåƒÄƒì jèB<ƒÄ=ÿ·vìƒì h0#èOåÇEèÇEìÇEð +ÇEôjEèPjÿµÿÿÿèÀsƒÄ ƒøÿuƒì h‘0#è åƒÄƒì jèÚ;ƒÄ=ŸÕvìƒì h®0#èç七Ä‹]üÉÉöU‰åSƒì‹E‹] ƒøt
+ƒøt +ëvÿ<\#ëÿ@\#ƒì jè€;ƒÄPÿ5@\#ÿ5<\#ÿs ÿs¸Ð/#ƒ{t¸Ö/#Pÿ3hÀ0#èqäƒÄ ‹]üÉÐU‰åƒìèé:ÉÍvU‰åSƒì‹]jè#;ƒÄ PSh 1#è8äƒÄ‹]üÉÃU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾D\#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
+è֜E¨‰$ècƒÄ…Àyƒì h€2#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=T]#„¶€ú*t€úªt
+€ú6t€ú¶uÆT]#¸é›„Òy,ÆT]#€ú¸uÆ`]#ÆV]#ëՀúuÐÆ`]#ëljöÆT]#€ú8u€ +`]#ÆV]#멀úu € +`]#뛉ö€ú5uf¾õ‡#·Àé)v€ú…•f¾܇#·Àé +v€úàuÆT]#éTÿÿÿv€ú*t€ú6u2ÆU]#€ú*u€ +`]#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ +`]# éÿÿÿv€úªt€ú¶u"ÆU]#€úªt €ú¶…öþÿÿÆ`]#éêþÿÿ€úFu€=Y]#•Y]#ë.v€ú:u€=W]#•W]#ëv€úEu;€=X]#•X]#ƒì¶Y]#P¶W]#P¶X]#Pèõ¸ƒÄé€úu€ +`]#éhþÿÿv€ú8u€ +`]#éTþÿÿv€út€ú¸uÆ`]#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+€úHt€úIu€=X]#uT€=U]#uK·Â +ÿë~€=W]#t/Bð< vBâ<vBÔ<w€=U]#t¶Âf¾€À‡#·ÀëG€=U]#t¶Âf¾€`ˆ#·Àë-v€=V]#t¶Âf¾€‰#·Àëv¶Âf¾€À‡#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  `]#ƒÈ@ë‰ö `]#ˆE؈UيE׈EÚ±»;¸‡#}8¾@‡#v݊D2:EÚuŠ2:EØuƒì Wÿ’D‡#±ƒÄC;¸‡#|ЄÉuƒìjW¿‚‰#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£P]#Šˆ‡#ŠPˆÇ#ŠPˆć#ŠPˆŇ#ŠPˆƇ#ŠPˆLJ#ŠPˆȇ#ŠPˆɇ#ŠPˆʇ#ŠP ˆˇ#ŠP
+ˆbˆ#ŠP ˆcˆ#ŠP ˆdˆ#ŠP +ˆeˆ#ŠPˆfˆ#ŠPˆgˆ#ŠPˆhˆ#ŠPˆiˆ#ŠPˆjˆ#ŠPˆkˆ#ŠPˆ̇#ŠPˆlˆ#ŠPˆ͇#ŠPˆmˆ#ŠPˆڇ#ŠPˆzˆ#ŠPˆۇ#ŠPˆ{ˆ#ŠPˆç‡#ŠPˆ‡ˆ#ŠPˆè‡#ŠPˆˆˆ#ŠP ˆé‡#ŠP!ˆ‰ˆ#ŠP"ˆõ‡#ŠP#ˆ•ˆ#ŠP$ˆó‡#ŠP%ˆ“ˆ#ŠP&ˆô‡#ŠP'ˆ”ˆ#ŠP(ˆë‡#ŠP)ˆ‹ˆ#ŠP*ˆù‡#ŠP+ˆ™ˆ#ŠP,ˆ·#ŠP-ˆnˆ#ŠP.ˆχ#ŠÖˆoˆ#ŠP0ˆÁ‡#ŠP1ˆaˆ#ŠP2ˆ܇#ŠP3ˆ|ˆ#ŠP4ˆĈ#ŠP5ˆ¯ˆ#ŠP6ˆ°ˆ#ŠP7ˆ±ˆ#ŠP8ˆ«ˆ#ŠP9ˆ¬ˆ#ŠP:ˆ­ˆ#ŠP;ˆ§ˆ#ŠP<ˆ¨ˆ#ŠP=ˆ©ˆ#ŠP>ˆ²ˆ#ŠP?ˆ³ˆ#ŠP@ˆˆ#ŠPAˆ÷‡#ŠPBˆõ‡#ŠPCˆ
+ˆ#ŠPDˆ®ˆ#ŠPEˆ—ˆ#ŠPFˆªˆ#ŠPGˆއ#ŠPHˆ~ˆ#ŠPIˆð‡#ŠPJˆˆ#ŠPKˆî‡#ŠPLˆŽˆ#ŠPMˆà‡#ŠPNˆ€ˆ#ŠPOˆ҇#ŠPPˆrˆ#ŠPQˆá‡#ŠPRˆˆ#ŠPSˆâ‡#ŠPTˆ‚ˆ#ŠPUˆã‡#ŠPVˆƒˆ#ŠPWˆׇ#ŠPXˆwˆ#ŠPYˆä‡#ŠPZˆ„ˆ#ŠP[ˆå‡#ŠPRˆ…ˆ#ŠP]ˆæ‡#ŠP^ˆ†ˆ#ŠP_ˆò‡#ŠP`ˆ’ˆ#ŠPaˆñ‡#ŠPbˆ‘ˆ#ŠPcˆ؇#ŠPdˆxˆ#ŠPeˆه#ŠPfˆyˆ#ŠPgˆЇ#ŠPhˆpˆ#ŠPiˆӇ#ŠPjˆsˆ#ŠPkˆ߇#ŠPlˆˆ#ŠPmˆԇ#ŠPnˆtˆ#ŠPoˆև#ŠPpˆvˆ#ŠPqˆï‡#ŠPrˆˆ#ŠPsˆч#ŠPtˆqˆ#ŠPuˆí‡#ŠPvˆˆ#ŠPwˆՇ#ŠPxˆuˆ#ŠPyˆì‡#ŠPzˆŒˆ#ŠP{ˆ‰#ŠP|ˆ‰#ŠP}ˆ'‰#Š@~¢(‰#]ÍvU‰åWVSƒì\‹]}ؾh]#ü¹󥿸ƒ=\]#…Qº¾À‡#¹`ˆ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇCP\#ƒì ÿsèûÿÿÇ$jjjh¹2#èϔf£‚‰#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjh¹2#è0˜f£„‰#ƒÄfƒøÿuƒì ¿‚‰#P蕛¸ýÿÿÿ頍vǸ‡#ƒ{ÿuÇCŒ"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+ÇE̍E¨ë‹ƒì jjPh” "hÂ2#èÿ‰ÃƒÄ ‰ˆ‰#ƒøÿu'ƒì ¿‚‰#P蓚¿„‰#‰$脚‰Ø钐ƒ=d]#uWƒì ÿ5ˆ‰#艉ǃąÿt4ƒì ¿‚‰#PèLš¿„‰#‰$è=šƒÄÿ5ˆ‰#èg5¸üÿÿÿë=Çd]#ëèƒì¶Y]#P¶W]#P¶X]#PèûÇ\]#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿„‰#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿„‰#Pèõ›·ÀƒÄÉÐU‰åSƒ=¸‡#0‹ +¸‡#Í»@‡#‹Ef‰ŠE
+ˆD‹E ‰‚D‡#A‰ +¸‡#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=\]#t9蓃ì ÿ5ˆ‰#è-4¿‚‰#‰$è昿„‰#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$¨2#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t +‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t +‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.Æt]#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐Æt]#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=t]#„þÆt]#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆt]#¸eô[^_]ÃU‰åVS¡ˆ]#…Àt¡ˆ]#H£ˆ]#¸é²¸ë6ƒ=€]#uKŠ„]#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ€]#뤍v¸ë:ƒ=€]#uGÇ€]#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡Œ]#@£Œ]#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆu]#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=t]#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡Œ]#@£Œ]#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆu]#¸eô[^_]ÍvU‰åƒìǤŠ#Ç Š#ƒ=|]#t!úè‹õÿÿ£x]#Ç|]#û…Àtúèôÿÿû¡x]#…Àuƒìÿuhx$"jèQ¸ƒÄÉÍvU‰åVS¡ˆ]#@£ˆ]#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ˆ]#@£ˆ]#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡ Š#@%ÿ£ Š#Š€ ‰#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=”]#t(Ç‹#Ç‹#Ç‹#Ç”]#‹E£]#ƒ=|]#t!úèôÿÿ£x]#Ç|]#û…Àtúèòÿÿû¡x]#…Àu.¸ìÿÿÿ€=t]#t ƒìjÿh´$"j èOÆu]#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡‹#@ƒà?£‹#ºÀŠ#ŠˆA¡‹#@ƒà?£‹#Šˆ¡‹#@ƒà?£‹#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=u]#tèäùÿÿƒì j èŽOÆu]#¸ƒÄÉÐU‰åƒìƒ=|]#t!úè óÿÿ£x]#Ç|]#û…Àtúè™ñÿÿû¡x]#…Àt¸ë¶t]#ÉÍvU‰åVSŠEŠU€} t ƒ +„]#ë ‰öƒ%„]#„Àt ƒ +„]#ëƒ%„]#„Òtƒ +„]#ë¸ë6¸ëbƒ%„]#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ€]#[^]ÐU‰åSƒìœúX‰Ã€=u]#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡ Š#;¤Š#t¡¤Š#ˆˆ ‰#@%ÿ£¤Š#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=‹#u €úúu¡Œ]#H£Œ]#郍v÷ÂÀuxÿ‹#œúX‰Á¡‹#;‹#t¡‹#ˆÀŠ#@ƒà?£‹#ë"‰ö¡‹#+‹#ƒÀAƒà?£‹#Ç‹#‰ÈPƒ=‹#uÇ‹#ƒì ÿ5]#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ÅÈâ#uèùÝNj¸ÿÿÿÿ鏐ƒ= á#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€¡â# t ÿ€¤â#ë-v‹EÑàE‰ÂÁâ)‹Õ¤â#ƒì‹•â#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€¡â# t ÿ€¤â#ë2v‹EÑàE‰ÂÁâ)‹Õ¤â#ƒì‹•â#ÿuRÿP@蔃ĉØPé­úèJ²‹Ìá#R‰ÑÁá)Ñ» â#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€¤â#ë?vƒìU‰ÐPjÿÐ]#‹MI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@è/ƒÄ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ= á#„“œúX‰ÇÇEð}ð™s¾ â#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€¤â#ë6ƒìEðPjÿÐ]#‹MðI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾ â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€¤â#ë8vƒìEðPjÿÐ]#‹MðI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ÇEð}ð™w¾ â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€¤â#ë8v‹MðI‰ÐÁà)ЋŤâ#ƒì‹•â#QRÿP@ƒÄEðPjÿÐ]#ƒÄÿEð}ð™~èÞ ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jèl–ƒÄUð¡ˆâ#;Øá#|¡„â#+Ôá#‰Eð¡ˆâ#+Øá#ë!‰ö¡„â#+Ôá#H‰Eð¡ˆâ#+Øá#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qè. ƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRLè{ ƒÄhÌá#jÿÐ]#ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèV ¡Ìá#@‰ÂÁâ)¿ըâ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìh8+"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=œ]#u(èè
+ƒì ¡Ìá#@‰ÂÁâ)¿ըâ#Pèt­ƒÄÉÍvU‰åWVSƒìhÊ2#è]$ƒÄ» â#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hDâ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾ â#¡˜]#‰3@£˜]#‹E ‰Dƒìjÿuƒ´â#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B +‰ƒ â#¿¤â#Ç;¾¨â#¡Ìá#@‰ÂÁâ)‹DÖ0‰3º¬â#ǍAP‹]ð‰˜ â#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁã#°Ç8Ç0ǁÁÀǁ â#Ç9ºۍƒ€ 
+Ç…ã#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂ¨â#ÿÿÿÿǂ¬â#ôâ#‰pã#º‹Mðɍ€ ‰ö
+Ç…pã#Bƒú~ì»ëC;Ðá#sƒì‹â#ÿuSÿPƒÄ…Àxß;Ðá#u7‹]ð[‰ÂÁâ)ÂfÇÕÈâ#ƒìhDâ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnž¤â#ƒì‹â#ÿuÿuðSÿP,ƒÄ…ÀyWfdžÈâ#ƒìhDâ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5Äá#s0ƒìµ‹ƒ`â#WVÿP ƒÄ…Àxۃ싃`â#WÿuðVÿP$ƒÄ;5Äá#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õ¬â#‰Æ‹UÑâU‰ÐÁà)Ѓ ÅÐâ#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅÎâ#Pè@‹UÑâU‰ÑÁá)Ñ»¬â#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)» â#·DÓ.ƃì ·GPjÿwVh$2"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õ¨â#ƒìU‰ÐPjÿÐ]#ƒÄöGu ÿÀá#ëvöGuÿ€â#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋŤâ#‹…â#ƒx(„èà…À‰€»;Äá#svƒì‹`â#VSÿP(ƒÄC;Äá#råv‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿR0fǃÈâ#ƒÄhDâ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;Äá#svƒì‹`â#VSÿP(ƒÄC;Äá#råv‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿR0fǃÈâ#ƒÄhDâ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Ìá#@‰ÂÁâ)¾ â#SÿTÖú‰$èn¡Ìá#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁຠâ#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸¤â#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰M乨â#‰Mì‹Uä‹
+‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…ã#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ +Ìá#I‰ÐÁà)ЍÅö‚Ðâ#tɍ€È‚Xã#…ã#¡„â#;Ôá#|;Ôá#uA¡ˆâ#;Øá#}4ƒìSÿ5Ìá#ÿ5Øá#ÿ5Ôá#ÿ5ˆâ#ÿ5„â#hà2#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ +Ìá#I‰ÐÁà)ЍÅöƒÐâ#„›ɍ€ȍ‹°¨â#º¤â#‹t‚`‹”À¸¬â#94s‰4‹Ìá#[‰ÁÁá)ÁÁፁÀ° â#¿¤â#B‰8±°‹†¨â#@º‰Ñº÷ñ‰–¨â#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁຠâ#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õ`ã#‰…ötI‰ÂÁâ)‹Õ\ã#‰…ÿtI‰ÂÁâ)‹Õdã#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕXã#‹…ã#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁຠâ#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ â#ǀ¤â#ǂ\ã#û¸]ÍvU‰åWVSƒì ƒ=Ìá#ÿt¡Ìá#@‰ÂÁâ)ÂöÕÐâ#…3ƒ=Ìá#ÿ„ƒìh„â#j證ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë"v¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QènüÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)Ћ<Ťâ#ƒì‹½â#QWÿP<ƒÄ¿4½ƒì ‹†â#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋŤâ#‹…â#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Ìá#‰àá#‰Ìá#[‰ÐÁà)Ð;Åðâ#t0» â#‰ö¡Ìá#@‰ÂÁâ)‹TÓP‰Ìá# R‰ÈÁà)È;TÃPu×;5Ìá#tƒìhÌá#jÿÐ]#ƒÄ‹ +Ìá#I‰ÐÁà)ÐÁྠâ#fÇD(‹¸¤â#ƒì‹½â#‹àá#¸;Ìá#•ÀPQWÿS8¡Ìá#@‰ÂÁâ)ƒÄöDÖ1„Ü¡àá#;Ìá#…Ë¡„â#‰EèMè¡Ìá#@‰ÂÁâ)»¬â#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5ˆâ#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Ìá#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰QjhP@"ÿuìÿuèÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèû7ƒÄ‰Üá#¡„â#£Ôá#¡ˆâ#£Øá#eô[^_]ÉöU‰åWVSƒìÇ0¢%úÿuèD»ƒÄ¿¤â#¾ â#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂ¬â#ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀ¨â#ǀ¬â#‚äâ#Ç@Çǂìâ#BP‰0Ç8ÇD`DŽÐ‚xå#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀ¨â#ǀ¬â#ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀ¨â#ÿÿÿÿǀ¬â#ºۍƒ€ 
+DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹¨â#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ Ÿ%ÿÿÿÿ»™¹¬â#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇüâ#ÿÿÿÿÇDâ#ÇÈá#ÇÀá#Ç€â#Çàá#ÿÿÿÿÇÌá#ÿÿÿÿÇÜá#ÿÿÿÿÇØá#ÇÔá#ÇÐá#ÇÄá#Ç á#èÚè}è42ƒì ÿuèqÉÿÿ£Hâ#ƒÄ=×Övƒì h@3#èÇ$è »ƒÄ¸ƒ=Hâ#”À‰Eè]è¡Hâ#‰CÇ0¢%躂ƒì S豌Ç$ä@"èÇÇ$$+"聎Ç$<@"蕎ƒÄjjèEÿØ]#ƒÄh„â#jèLƒèOùÿÿèê›f£@â#¡Ìá#@‰ÂÁâ)¾ â#¿DÖ‰$èϛÇ$è7ŽÿÔ]#Ç0¢%ƒÄ»ƒ=Èá#ŸÃSjèɃă=€â#teè„ Çœ]#ƒìh„â#j軂è^›f£@â#è³øÿÿÇ$<@"èǍ¡Ìá#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇ0¢%ƒìSjèCèÇ0¢%ƒÄjjè(ƒÄúƒ=Èá#t"ƒìÿ5Èá#hk3#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=œ]#…•èW‰…Àuú腚‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹E£Èá#Çœ]#ƒ=Ìá#ÿ„ƒìh„â#j藁ƒÄUð¡ˆâ#;Øá#|¡„â#+Ôá#‰Eð¡ˆâ#+Øá#ë ¡„â#+Ôá#H‰Eð¡ˆâ#+Øá#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèZôÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿR<Çàá#ÿÿÿÿÇÌá#ÿÿÿÿƒÄèü‡…Àtƒì ¿@â#Pè,™ƒÄëvƒì ¿@â#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»ºâ#¡â#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwºâ#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇÜá#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=0¢%tƒ=€â#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸Èá#ƒ=Ìá#ÿt‹Ìá#R‰ÐÁà)ЍÅã#]ÉöU‰åSƒìœúX‰Ãƒ=0¢%tƒ=€â#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹(‹#t[¿ ‹#ƒ<9tP‹Ìá#ҍ‚€Ð؍…о â#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Ìá#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt +ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾ ‹#»$‹#¹(‹#vRÁàÇ0B‰Çƒú~ãÇ‘#ÿÿÿÿÇ ‘#Ç(‹#Ç ‹#Ç$‹#ÿÿÿÿ[^]ÐU‰åS‹Múƒ= ‘#ÿu û¸ ënv¡ ‘#@Ç•(‹#‰¡ ‘#@‹…$‹#£ ‘#‹@‹U ‰… ‹#º» â#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Ìá#À’ÂU‹•pã#û]ÍvU‰å‹Múƒùw +Iƒ<…(‹#u û¸ë%v¡Ìá#À’ÂʋE ‰•pã#û¸]ÃU‰åS‹]œúX‰Áƒûw +[ƒ<…(‹#u‰ÈP¸ë.v[Áà‹ ‘#‰$‹#ǀ(‹#‰ ‘#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Ìá#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿ â#öD0 tm‹E‰‚lã#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀº¨â#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿRD‰tPƒÄ¹» â#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Åôâ#t[»¤â#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)» â#¿DÓPèÔyƒÄEðPjÿÐ]#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õ¬â#èÁ ƒÄ»;Äá#sƒì‹`â#ÿuðSÿP(ƒÄC;Äá#rã‹MðI‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRPÇÌá#ÿÿÿÿÇàá#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕÐâ#u&ÿ +Àá#ƒ=Àá#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕÐâ#uÿ +€â#ƒ=€â#uèúÿÿƒìh„â#jèÒyƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁຠâ#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅÑâ#tû雉ö;5Ìá#uJv‰ÐÁà)л â#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)Ё ÅÐâ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡àá#@‰ÂÁâ)Âf‹Mòf; ÕÌâ#”Eñ¾¿ â#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Ìá#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡àá#@‰ÂÁâ)¿ըâ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿ â#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+uB»ë‰öC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Ìá#@‰ÂÁâ)» â#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡ ]#ʼnŠ@‘#‰šD‘#@£ ]#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Ìá#@‰ÂÁâ)¿ըâ#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=t”#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ +t”#‰ÊÁâ‹‚ì‘#£t”#‹E‰‚à‘#‹E ‰‚ä‘#‰ðƒà‰‚è‘#‰ðƒàƒøtOƒø
+ƒøt +ësvƒøtSëi‰ÈÁàǀì‘#ÿÿÿÿƒ=`”#ÿu‰ +`”#ë¡d”#Áà‰ˆì‘#‰ +d”#ëH‰ö‰ÊÁâ¡h”#‰‚ì‘#‰ +h”#ë.‰ÊÁâ¡l”#‰‚ì‘#‰ +l”#ë‰ÊÁâ¡p”#‰‚ì‘#‰ +p”#‰ØP¸[^]ÐU‰åƒìƒ=Ðá#uƒì h 3#èŒÇ$謃ġÐá#P‰Ðá#ÉÐU‰åƒìƒ=Äá#uƒì h¿3#èPÇ$èÌ«ƒÄ¡Äá#P‰Äá#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿè=´ÿÿƒÄeô[^_]ÉöU‰å¸¹ì‘#v‰ÂÁâ@‰
+ƒø&~òÇ\”#ÿÿÿÿÇ`”#ÿÿÿÿÇd”#ÿÿÿÿÇh”#ÿÿÿÿÇl”#ÿÿÿÿÇp”#ÿÿÿÿÇt”#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹`”#Ç`”#ÿÿÿÿë:‰ö‹h”#Çh”#ÿÿÿÿë&‰ö‹l”#Çl”#ÿÿÿÿë‰ö‹p”#Çp”#ÿÿÿÿÇ á#ƒûÿtM¾ì‘#…ÿt‰ØÁàƒ¸è‘#uƒì ‰ØÁàÿ°ä‘#ÿà‘#ƒÄ‰Ù‰ØÁà‹0‰Â¡t”#‰2‰ +t”#ƒûÿu¸Ç á#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$€”#èÉӃÄjjhÿÿjh„”#h€”#èôɃÄjjhÿÿÿhh ”#h€”#èÔɃÄjjhÿÿÿþhh¼”#h€”#è´ÉƒÄ ƒ}ütƒì‹EüHPÿuøh€”#è~ȃă}ôtƒìÿuôÿuðh€”#èbȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh€”#è ʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh€”#è¼ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh€”#è¶ËƒÄ ÉÐU‰åƒì ÿu ÿuh€”#èjЃÄÉÐU‰åƒìÿuh€”#èQ΃ÄÉÃU‰åƒìÿuh€”#èQ҃ÄÉÃU‰åƒì jÿuh€”#èWɃÄÉÉöU‰åƒì ÿu ÿuh€”#èЃÄÉÐU‰åƒìh€”#èÎÇ$€”#è$҃ÄÉÍvU‰åWVSƒì} ‹uEðPh4#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;¤]#~hƒìWVhà”#蜃Äj
+VèK›ƒÄ»…À•ÃœúX‰Æƒìhà”#‹Eðÿ4…¨]#h4#è]™ƒÄ…Ûuƒì h¼4#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;¤]#~JƒìVShà”#èB›ƒÄj
+S臚ƒÄœúX‰Ãƒìhà”#‹Eôÿ4…¨]#h4#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5à˜#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5à˜#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuh!4#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5à˜#èc6ƒÄÉÉöU‰åƒìÿ5à˜#èc6ƒÄÉÉöU‰åƒìÿ5à˜#è{5ƒÄÉÉöU‰å‹E‹U ‹M£à˜#‰ä˜#‰ +è˜#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5à˜#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5à˜#è3‰ÃƒÄ…Ûu#ƒìÿ5à˜#èx5ƒÄ+PWÿ5è˜#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5à˜#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5à˜#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u +ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹xå#‰U苀|å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õxå#|[‰Eäv1‰ÐÁà)ЍÅ;šxå#u ‹Eì;‚|å#|1‰Ï‰ÐÁà)Ћ Åøâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åxå#}«ƒÿÿt‰ÐÁà)ЋU‰Åøâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л¤â#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»¨â#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åøâ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹¬â#‹°¨â#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»¨â#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»¬â#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋÅøâ#‰ƒøÿt@‰ÐÁà)ÐÇÅüâ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õüâ#[‰ÂÁâ)ÕP‹‰‚¨â#ǂ¬â#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Ìá#@‰ÂÁâ)4Õ â#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ›#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì R范ċ^8‰Ø÷Ћ +›#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ÅÈâ#u +¸éӍvú‰ÈÁàö€™#uƒ¸™#uû魉öv‰ÐÁà)ЍÅÜâ#ƒùvèÍ©Çë
+¸Óà »ëC;Ì]#}ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»Èâ#u&ƒìh›#VèÔüÿÿ‹ƒ¤â#ƒÄ‹…â#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ™#ü¹‹}ó¥…Òt‰ßÁçÇ™#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ< ›#ÿtq4‰uìº ›#‹@Áà‰Eè‰ÇƒÇ‹ +@¨%¸@¢%‹U苉E䋇D¢%©t +ƒàý‰‡D¢%ë‰ö¾ ›#‹Uì‹2@‰ Õ@¢%‰Áƒ}äÿu»‰ +@¨%ǝ ›#ÿÿÿÿƒûv +è¨Çë¸þÿÿÿˆÙÓÀ!›#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁ƙ#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#›#…Àt +‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà ›#‹5›#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅàâ#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸Èâ#uÜâ#ƒûv +輦Çë 8ƒìh›#Vèúÿÿv‰ÃÁã)ÃÁ㋃¤â#ƒÄ‹…â#VPÿRDÃྠâ#ƒÄƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Åøâ#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸Èâ#„…Øâ#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅÜâ#ƒûvèÃ¥Çëv 8»ëvC;Ì]#}0ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 +‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁ƙ#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#›#…Àt ‹UԉÐPéÃ=@¨%ÿu‹MԉÈP¸ 鮉ö‹5@¨%vÁà¹@¢%‹‰@¨%‹U ‰D¢%‹U‰H¢%‹U‰L¢%‹Ìá#‰P¢%Çÿÿÿÿ‹E Áຠ›#ƒ<ÿu‰4ë>‰ö‹M ‹ ›#‰ÁЃ<Å@¢%ÿt»@¢%
+‹Í 
+ƒ<ÃÿuîR‰4Å@¢%ƒ} vèé£Ç됸ŠM Óà ›#‹5›#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅàâ#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸Èâ#uÜâ#ƒ} vèS£Çëv ƒìh›#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃¤â#ƒÄ‹…â#VPÿRDÃྠâ#ƒÄƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Åøâ#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸Èâ#„…Øâ#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅÜâ#ƒ} vèV¢Çë‰ö »ëvC;Ì]#}0ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=È]#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Ìá#@‰ÂÁâ)<Õ â#èŠú¡›##„Hºv©u=BÑøuô¾ƒ<µ ›#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!›#ûév µº ›#‹[‹Å@¢%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!›#W<ƒþv +èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹D¢%‹
+‹u ‰‹‚H¢%‰F‹‚L¢%‰FƒÂ‹
+©t ƒàý‰
+ëv[¡@¨%‰Õ@¢%‰@¨%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u +û¸ éÓ‰ö‹‰G@úèu‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jèN\ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèÏÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRHƒÄh›#ÿ5Ìá#èæòÿÿ¡Ìá#@‰ÂÁâ)ÂfÇÕÈâ#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày +ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Ìá#hÐr"ÿuÜÿuØÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèù ƒÄ¡Ìá#@‰ÂÁâ)‰Հå#ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿè‡Ðÿÿƒì ¡Ìá#@‰ÂÁâ)» â#¿DÓPèsè”ÇG@¡Ìá#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡›##„ûº‰ö©uáBÑøuô¾ƒ<µ ›#ÿu=‹M ‰1ÇAÇAƒþv +è@Çë¸þÿÿÿ‰ñÓÀ!›#ûé vƒì µƒ ›#Pèúðÿÿ‰ÇƒÄƒ» ›#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!›#Áâ¹D¢%‹
+‹] ‰‹‚H¢%‰C‹‚L¢%‰CƒÂ‹
+©t ƒàý‰
+ëv¡@¨%‰Õ@¢%‰=@¨%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Ìá#@‰ÂÁâ)4Õ â#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jè6XƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèúÊÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRHƒÄh›#ÿ5Ìá#èÍîÿÿ¡Ìá#@‰ÂÁâ)» â#fÇDÓ(ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿè Íÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=¨›#ÿu
+ÇEèëWMèU𡤛#;B|¡ ›#+Eð‰E衤›#+Bëv¡ ›#+EðH‰E衤›#+Eôʚ;‰Aƒì ÿ5¨›#ÿ¨á#ƒÄ…ÛtN]ð‹E𣠛#‹Eô£¤›#jh0s"ÿuôÿuðÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè:ƒÄ‰¨›#ë +vǨ›#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ ›#ÿuC‰uèÇEìÇEð¡Ìá#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!›#降 µº ›#‹[‹Å@¢%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!›#[Áà¹D¢%‹‰U苐H¢%‰U싐L¢%‰Uð‹P¢%‰UôP‹
+©tƒàý‰
+ë[¡@¨%‰Õ@¢%‰@¨%ƒìEèPVè
+ƒÄeø[^]ÃU‰åVSƒì¡Ìá#@‰ÂÁâ)4Õ â#‹F0©…Í +‰F0‹F8‰Ã÷Ћ›#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ +›#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+CÑøuòº‰UèÇEìÇEð¡Ìá#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Ìá#@‰ÂÁâ)Õ â#‰UЉÞÁæ}؁ƙ#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìSh,4#èw}ƒÄ÷Eàtƒì‹M ÿqhB4#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv +èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv +è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁྠâ#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄƒìh›#Wèúèÿÿ‰ÂÁâ)‹Õ¤â#ƒÄë ‰ÐÁà)ÐÁàfƒ¸Èâ#u!‹¤â#ƒì‹•â#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿™#¾™#» ™#¹ ›#‰ö‰ÐÁàǀ™#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»@¢%¹D¢%RÁàB‰ÇDƒú>~éÇ(¨%ÿÿÿÿÇ<¨%Ç@¨%Ç›#Ç›#ÿÿÿÿǨ›#ÿÿÿÿº¹`œ#»dœ#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjh°m"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu +‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Ìá#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Ìá#@‰ÂÁâ)¡›# ÕÜâ#‰¸]ÉöU‰åSƒì‹E‹U ú‹Ìá#‰Ìá#ÇÈ]#jPj jèœìÿÿƒÄÇÈ]#‰Ìá#û‹]üÉÍvU‰åS‹M‹] ¡Ì]#ʼnŠÀ›#‰šÄ›#@£Ì]#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…hœ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹`œ#‹E ‰
+‹E‰‚dœ#ÆD
+ƒìjhps"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Ìá#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁ㸠â#DŽàÿÿÿÿL0ƒìh›#Vèõãÿÿ‹ƒ¤â#ƒÄ‹…â#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìǨ›#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿÐ]#‹UüRÁà¹`œ#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…dœ#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ= ¤#ÿt ƒ=@¨%ÿuûèƒÇ ¸ÿÿÿÿéCv¡ ¤#‰‹ ¤#Õ)п$#‹DÇ0£ ¤#‹Õ)й #ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅ(#닍<Å)Ǎ<ý #ü¹ó¥‹Õ)ЍŃº #u#¡@¨%‰‚H#@ÁàƒˆT¢%‹€@¢%£@¨%‹Õ)ÐÇÅ4#ÿÿÿÿ‹Õ)ЍÅ8#Ç@NjÕ)ЍÅ@#Ç@NjÕ)ÐÇÅL#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<ÅP#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀP#ƒÀº$#ƒ<ÿtƒì ÿ4ÿ¨á#ƒÄÝ)ØÁàƒ¸ #uE‹H#R ÅöT¢%u¡@¨%‰@¢%‰@¨%Ý)؋ÅH#@ƒ$ÅT¢%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸ #…‹P ‹‚(#@öÅT¢%t¸,#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJ,#¾(#‹7@‹@¨%‰Ý@¢%£@¨%jÿ41ÿ±$#jèhçÿÿ‹7@ƒ ÅT¢%錐‹E´Áà+E´Á๠#ƒ<uwPƒ<
+tÿ°(#ÿ°,#ÿ4
+ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áà(#Rÿ°,#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸(#u +ƒ¸,#„Àº@#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒ8#‰ƒ@#‹Aƒ<#‰B…Àyÿ‹@#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´h<v"ÿ4ÅD#ÿ4Å@#ÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè+ùÿÿƒÄ‹E´Áà+E´‰Å4#ë‰ö‹E´Áà+E´ÇÅ4#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<ÅP#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Å4#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹@#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹@#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹8#õ)ðÁà‹‰‹D‰Gõ)ðÅº$#ƒ<ÿtƒì ÿ4ÿ¨á#ƒÄ‹Eƒxu
+ƒx „þº8#õ)ð ŋ]‹‰
+‹C‰D
+÷E t¸@#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘@#‹Eè‹]C‰@#‹EìC ‰B…Àyÿ‰@#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVh<v"ÿ4ÅD#ÿ4Å@#ÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè­öÿÿƒÄõ)ð‰Å4#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<ÅP#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Å4#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹@#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹@#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹8#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt +ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<ÅP#uûè܆ǸÿÿÿÿëvÕ)ЋÅL#ûÉÐU‰åWVS¹»$#¿ #¾,#‰öÍ)ÈÁàÇDÿÿÿÿ8#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ¤#ÿÿÿÿÇ ¤#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Ìá#@‰ÂÁâ)¾ â#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡Ìá#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Ìá#@‰ÂÁâ)¹ â#‹DÑ0Áèƒà‹U ‰¡Ìá#@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Ìá#@‰ÂÁâ)¹ â#‹DÑ0Áè ƒà‹U ‰¡Ìá#@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5Äá#s9v‹µ`â#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5Äá#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…`â#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µâ#ƒìÿ°ôhy4#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°¤â#……ƒÀ º â#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè ¨ƒÄë%v·Ð¸S4#ú€t¸_4#út¸k4#P[‰ÐÁà)ÐÁàÿ°tå#´â#PShà4#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…â#‰Eð‹¸üƒì ‹Uð‹‚ðøPèo§‰ÆƒÄƒþÿu +¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ ÅöÑâ#tRQ@»¬â#ƒ<D‹„å#‰ƒìý‰Ø‹Uð‚ðPVè\¥ƒÄ‹Eð˜ðSV腦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…â#‰Eð‹Mƒy(…©‹=Ìá#‰ÐÁà)Ѝž¤â#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„й¬â#‹D@‰D@‹„à‰„àƒÂ0¹ â#‹
+%ÿ÷ÿÿ‹\0ã ؉
+‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁ⻤â#‹A‰„Ѓyt‹A‰‚ìâ#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰ìâ#‹“ô‰„å#ƒy$u‹E @‰ÐÁà)Ё ÅÐâ#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•â#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅtå#‹—ðÂPÿu 詤酋E @‰ÐÁà)ЍÅöƒÑâ#t?K@¾¬â#ƒ<11º¤â#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èK¤ë*ƒì‹E @‰ÐÁà)ЋÅtå#‹—ðÂPÿu è³£ƒÄ‹E @‰ÐÁà)ÐfÇÅÈâ#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã +f‰E¸‹â#‹€ø‰EÈÇE̍E¸jjPhô"h…4#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì h 5#èVËÿÿƒÄ‹<â#v‰ÐÁà)Ðfƒ<ÅÈâ#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃äâ#PjèJ;fǃÈâ#€ƒÄ‹ƒtå#‹—ðÂPVè䢃čeô[^_]ÐU‰åWVSƒì‹}hŠ4#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPh 4#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄSh¾4#è‡Êÿÿ‹Eð‰…â#ƒÄ jhÊ4#Sè=efÇCÆCÇCä‰"ÇCŠ"ÇC Ø"ÇC$¸€"ÇC(Š"ÇC,x"ÇC0(Š"ÇC40Š"ÇC8<Š"ÇC<ð‚"ÇC@|Š"ÇCD‹"ÇCHP‹"ÇCLX‹"ÇCPð‹"ÇCT8Œ"ÇCXlŒ"ÇC\P"ÇC`p"ÇCdˆ"ÇCh "ÇCl¸"ÇCpЍ"ÇCtè"ÇCxŽ"ÇC|Ž"ǃ€0Ž"ǃ„HŽ"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPèꟃÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðhìƒ"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹â#‰Eð…Éx[; +Ðá#sS‹â#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ÅÈâ#u +¸éèvv‰ÐÁà)Ð9 Ťâ#t +¸&éȍv…Ûuv‰ÐÁà)Ё ÅÐâ#ë)ƒûuv‰ÐÁà)Ё$ÅÐâ#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿¤â#‹U9;t\f¸Èâ#€u=ƒì‹;‹Mð‹‘ðÂPV蜞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV蹟ƒÄëv‰ÐÁà)ЋU‰Åtå#¸eô[^_]ÍvU‰åVS‹M‹4â#…Éx; +Ðá#s‹â#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Ìá#@‰ÂÁâ)¸ÿÿÿÿ9 Õ¤â#uZúè!P‹Ìá#R‰ÑÁá)Ñ» â#f‰DËdžèX­ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…â#‹€ü]ÍvU‰å‹E‹…â#‹€ô]ÍvU‰åS‹]‹M …ÛxU;Ðá#sM‹â#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ÅÈâ#u¸ëMI‰ÐÁà)Ð9Ťâ#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öÑâ#”À‹U‰‹‘tå#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E +9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…â#I‰ÐÁà)ЋÅtå#‹“ðÂPQè;œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…â#v‰ÐÁà)Ðfƒ<ÅÈâ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃äâ#PjèR5fǃÈâ#€ƒÄ‹ƒtå#‹—ðÂPVè윃čeô[^_]ÐU‰åSƒì ‹E‹M ‹…â#I‰ÐÁà)ÐÁàfǀÈâ#€‹€tå#‹“ðÂPQ蠜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•â#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃äâ#Pjè‹4ÿ 7ƒÄ‹ƒtå#‹Mð‹‘ðÂPÿu 躛fǃÈâ#€ƒÄë‹E @‰ÐÁà)ÐfÇÅÈâ#eô[^_]ÐU‰åƒì‹E‹M ‹…â#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅÈâ#hDâ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…â#ƒÀDŽ€R‰ÐÁà)ÐfÇÅÈâ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅÈâ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVh`Ž"ÿuìÿuèÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèAäÿÿƒÄ v‰ÈÁà)ȉŀå#eô[^_]ÐU‰åƒìÿ5Ìá#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Ìá#jèñãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèÙãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèÁãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè©ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèyãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèaãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèIãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè1ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁ㺤â#‹‹4…â#¿ â#fÇD(€‹„Ћ–ðÂPQè=™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h@6#è
+Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µâ#ƒÄ jhØ5#Sè®[fÇCÆCÇC "ÇC@"ÇC L"ÇC$t"ÇC(ÇC,Œ"ÇC0˜"ÇC4 "ÇC8¬"ÇC<´"ÇC@А"ÇCDø"ÇCH ‘"ÇCLH‘"ÇCPp‘"ÇCT˜‘"ÇCXÀ‘"ÇC\è‘"ÇC`’"ÇCd<’"ÇChd’"ÇClŒ’"ÇCp´’"ÇCtܒ"ÇCx“"ÇC|,“"ǃ€T“"ǃ„|“"ǃˆÿÿÿÿÇ$ã5#èô¿ÿÿƒÄ jVh¤“"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹â#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…â#ÿ°ˆhE5#èìYƒÄÉÍvU‰å‹E‹…â#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕÈâ#]ÃU‰åƒìhT5#èxYƒÄÿ5Ìá#j è„àÿÿƒÄÉÍvU‰åƒìh[5#èPYƒÄÿ5Ìá#j è\àÿÿƒÄÉÍvU‰åƒìhb5#è(YƒÄÿ5Ìá#j è4àÿÿƒÄÉÍvU‰åƒìhi5#èYƒÄÿ5Ìá#j è àÿÿƒÄÉÍvU‰åƒìhp5#èØXƒÄÿ5Ìá#j èäßÿÿƒÄÉÍvU‰åƒìhw5#è°XƒÄÿ5Ìá#j è¼ßÿÿƒÄÉÍvU‰åƒìh~5#èˆXƒÄÿ5Ìá#j è”ßÿÿƒÄÉÍvU‰åƒìh…5#è`XƒÄÿ5Ìá#jèlßÿÿ¸ƒÄÉÉöU‰åƒìhŒ5#è4XƒÄÿ5Ìá#jè@ßÿÿƒÄÉÍvU‰åƒìh“5#è XƒÄÿ5Ìá#jèßÿÿƒÄÉÍvU‰åƒìhš5#èäWƒÄÿ5Ìá#jèðÞÿÿƒÄÉÍvU‰åƒìh¡5#è¼WƒÄÿ5Ìá#jèÈÞÿÿƒÄÉÍvU‰åƒìh¨5#è”WƒÄÿ5Ìá#jè ÞÿÿƒÄÉÍvU‰åƒìh¯5#èlWƒÄÿ5Ìá#jèxÞÿÿƒÄÉÍvU‰åƒìh¶5#èDWƒÄÿ5Ìá#jèPÞÿÿƒÄÉÍvU‰åƒìh½5#èWƒÄÿ5Ìá#jè(ÞÿÿƒÄÉÍvU‰åƒìhÄ5#èôVƒÄÿ5Ìá#jèÞÿÿƒÄÉÍvU‰åƒìhË5#èÌVƒÄÿ5Ìá#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh0”"hÒ5#趜ÿÿƒÄ ‹â#‰Ã‰šˆƒûÿuƒì h6#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅØâ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàº@¤#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…D¤#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹Å#ƒúÿtqÕ)Ѝ<…w‹†D¤#£Å#ƒì ÿuèV@‰$臹ÿÿ»@¤#‰ƒÄÿuPè7U‹Eð‰‡H¤#‡L¤#‰$è,‘ÆDƒÄû‡D¤#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»@¤#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾@¤#ÿ43è%¹ÿÿƒÃÆD3¡Å#‰ƒD¤#‰=Å#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…X¤#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ4…@¤#ƒ~ ÿu
+ƒ~…“ƒìWjÿÐ]#ƒÄh„â#jè8)ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë!‰ö¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qèú›ÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRH‹ +Ìá#I‰ÐÁà)л â#fÇDÃ(Íǂ@À#‹‰‚DÀ#ƒÄF PQèÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèõÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…X¤#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ4…@¤#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿÐ]#ƒÄh„â#jèš&ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qè^™ÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ +Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRH‹ +Ìá#I‰ÐÁà)л â#fÇDÃ(͋E ‰‚@À#‹‰‚DÀ#ƒÄF PQè'ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèZ›ÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…X¤#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…@¤#‹JA‰J‹Z ƒûÿtG‹Ý@À#9È<)Á‰È‰BƒìB PSèʊ[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPDèÿÿƒÄƒìWjÿÐ]#ƒÄ‰ðPé¼‰öúèª<‹àá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ…@¤#‹JA‰J‹Z ƒûÿtG‹Ý@À#9È<)Á‰È‰BƒìB PSè*Š[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD荙ÿÿƒÄƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…X¤#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…@¤#^‹^ ƒûÿts݉‹€@À#;F_¿@À#ÇEðv‹F+:‰FƒìF PSè
+‰[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿÐ]#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹àá#R‰ÑÁá)Ñf‰ͨâ#‹E‹Õ)Ѝ4…@¤#^‹^ ƒûÿtr݉‹€@À#;F^¿@À#ÇEð‰ö‹F+:‰FƒìF PSè2ˆ[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿÐ]#ƒÄƒ}ðtèd—ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿D¤#õ)óÁãǃ@¤#‰4;ǃH¤#ƒì ƒL¤#PèF‡ƒÃF‰;ƃH¤#ƒÄ‰Æþÿ~±Ç8À#ÿÿÿÿÇÅ#ƒìjhä¢"è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…X¤#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л@¤#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)ЋÅ#‰…T¤#‹£Å#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…X¤#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…L¤#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…X¤#‹Õ)ЋÅ#‰…T¤#‹£Å#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…X¤#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸L¤#ÿu ‹€H¤#‰ë7‰öÇ‹Õ)Ћ…L¤#¹¨â#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹Å#‰ƒúÿtnÕ)Ћ…T¤#£Å#‹Õ)л@¤#ǃ‹Õ)Љ …H¤#ƒì ‹Õ)Ѝ…L¤#P腄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…X¤#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…@¤#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<ÕÈâ#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾Èâ#uAƒì‹ÝDÀ#Õ)Ѝ…L¤#PS脃‹†¤â#ƒÄ‹…â#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=Ü]#…ÚÇÜ]#¹»`¨%¾d¨%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh Å#èÜýÿÿ¹ƒÄ¾Äª%»Àª%‰ö‰ÁàQ‰0Ɖуù +véÇô¬%ÿÿÿÿÆð¬%Ǹª%¹¾$­%» ­%vÍ)ÈÁàQ‰0ƉуùvãÇP°%ÿÿÿÿÆL°%Çh°%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=¸ª%ÿuèí^ǍûÇEìÿÿÿÿ됡¸ª%€‹ÕĪ%‰¸ª%û‰Eìƒ}ìÿu +¸ÿÿÿÿéìvƒì h Å#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<ŀ¨%t0ƒìÿu¿ōƒ`¨%Pè³EƒÄ…Àu€»x¨%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ€¨%ƒìÿuƒ`¨%Pè÷D‹E쉃t¨%ƒÄ€}óu‰Â’‹] f‰ÅȪ%ëv‹E썀‹E ¯Ef‰ÕȪ%úƒì ‹U썒Á㷃Ȫ%PèݨÿÿºÌª%‰ƒÄû…Àu%è”]ǒƒì h Å#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾Àª%‹ƒÌª%‰‚Ī%‰2ƒìjjƒÜª%Pè:ûÿÿƒÄ ·D3Pjƒàª%Pè#ûÿÿƒÄ jjÃäª%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=h°%ÿuèø\ǎûÇEèÿÿÿÿë¡h°%Å)‹•$­%‰h°%û‰Eèƒ}èÿu_ƒì h Å#èvôÿÿ‹Eèéä‰öè§\ǐƒì h Å#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h Å#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁ๠­%ŠUòˆT P‹]ì‰
+‹] f‰\
+ǀ$­%ÿÿÿÿ‰º(­%‹]썛ÆÕÀª%ƍ¿ōr¿`¨%€|>t%ƒì¶D>Pš|¨%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h Å#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=h°%ÿuèa[ǎûÇEìÿÿÿÿë ¡h°%Å)‹•$­%‰h°%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁຠ­%ˆ\ ‹M f‰Lǀ$­%ÿÿÿÿƒì h Å#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<ŀ¨%u ¿ÆEçë8ƒìÿu¶Å`¨%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Áã¸`¨%ÆD ÆDƒìÿuPè>AƒÄ jjÃ|¨%Sè/øÿÿÇ$ Å#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº`¨%€|t'þDƒì h Å#è®ñÿÿƒÄ jjƒ|¨%Pèûîÿÿ됃ì h Å#è‹ñÿÿƒÄ¶‹<Åt¨%¿ŠUó:Åت%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·ÅȪ%9E u€}ót(¿·ÅȪ%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h Å#è ìÿÿ¶‹ń¨%ƒÄƒúÿ„­€}óu#è&YǕƒì h Å#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…4­%9E t"èíXǔƒì h Å#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »d¨%‹‰$­%‹Mì‰ ë/‰öèŸXǑƒì h Å#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰ń¨%ƒì h Å#è*ðÿÿ‹EìÁà+EìÁàH‰±(­%º ­%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗 ­%‰Uðh Å#èÏêÿÿ‹Mð‹Y›ÁãC‰Eèºd¨%‹€Áà°Àª%ƀÀª%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹d¨%‹Eè‹ú ’¡¸ª%‰ÍĪ%‰¸ª%ûƇ ­%ƒÃ ‹Uð‹B‰ƒd¨%ú¡h°%‰‡$­%‹Mì‰ +h°%ûƃ`¨%Ç$ Å#è
+ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ… ­%‰Eð‹@€ÅÀª%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ… ­%‰Eð‹@€ÅÀª%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìh_6#è;ƒÄÿ5¸ª%hk6#è;»ƒÄÝ)ØÁà€¸ ­%t8 ­%‹B€ÅÀª%ƒì ÿp ÿp$‹B€Å`¨%PSh6#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…0­%’ÅÀª%ÿp ÿp$RQh 6#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h Å#èHæÿÿ¿ÓÕ)Ѝ …‹8­%€Å ƒÄ€º`¨%u ‹$­%‰‚d¨%¿ÃÅ)ÂÁâƂ ­%ú‹ +h°%‰Š$­%£h°%ûƒì h Å#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…`â#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Ìá#u û¸#é~ƒ;ÿtc¾ â#‰ö‹ +Ìá#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Ìá#‰CÿCè…ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡Ìá#ÿD‡D¡Ìá#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Ìá#tû¸髍vúè*'‹Ìá# [‰ÊÁâ)Êf‰Õ¨â#‹E‹…`â#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅðâ#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h7#è~ÿÿè +™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ`â#ƒÄ jh7#Sè"8fÇCÍÆCÇCÇC$³"ÇC p³"ÇC$|³"ÇC(„³"ÇC,´³"ÇC0à³"ÇC4(´"ÇC8ˆ°"ÇC<p´"ÇC@p±"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…`â#ƒì hà6#è7¾ƒÄƒÃƒìÿt³@hÿ6#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…`â#ƒÀƒ|@tƒìRj
+èȽÿÿƒÄÉÍvU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+û¸ë"‰ö¡Ìá#‹½`â#ƒÂÿD‚@¡Ìá#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•`â#ú‹p¸…ö„V‹;Ìá#u û¸#éA‹Ìá#‹F ¿ â#;„“°v +¸é v¡Ìá#‹Œƒ°‹“¬…Òt‰ö‹;Ìá#…Š‹R…Òu븅À…†‹ +Ìá#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Ìá#‰B‹ƒ¬ÿ@èj€ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…`â#¡Ìá#ÿDƒD¡Ìá#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½`â#ú‹X¸…Û„Ù‹;Ìá#uû¸#éčv‹Ìá#‹C ;„‘°s
+¸饡Ìá#‹´°‹‘¬…Òt‰ö‹;Ìá#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½`â#¡Ìá#ÿDD¡Ìá#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Ìá#tû¸éڍvúè&!‹Ìá# [‰ÊÁâ)Êf‰Õ¨â#‹E‹…`â#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅðâ#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu +‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hD7#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4`â#ƒÄ jhX7#Vèî1fÇFÌÆFÇFÇF,º"ÇF °º"ÇF$ܺ"ÇF( »"ÇF,T»"ÇF0€»"ÇF4Ø»"ÇF8è´"ÇF<p¶"ÇF@t·"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…`â#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…`â#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…`â#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…`â#hà6#è0»ƒÄwƒìÿtž@hÿ6#èó/ƒÄCû™~ãƒì h"7#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h>7#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …`â#Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹…`â#ƒ|³DtƒìVj
+èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Shb7#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿ ½%ÿt8CP‰Eä·8Phi7#èá-ƒÄ ÿt;·D;Phw7#èÊ-ƒÄ ÿt; s·>Phˆ7#è±-ƒÄ ÿt>·D>Ph™7#èš-ƒÄ ‹Uä·D:P·DLPhª7#è~-‹UèÕƒÄ·ØSh»7#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh8#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º@&fƒ=@&yA¿Áfƒ<Byfù™~îfù™~ƒì hÐ7#èÎ,¸ƒÄé ¿Á<¹@&‰Úf Ê€f‰Ǎ<ÿÁçº ½%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇŒ½%¾@A&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁ๠½%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ@&]ÉöU‰åSƒì‹]¿E Phè7#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhÆ"SèƒÄh¤¿"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹à]#€82uºð°îƒìShB9#èˆ*ƒÄÁ㋃à]#@PhC#èp*ƒÄÿ³$^#ènƒÄ‹]üÉÉöU‰åƒìÿuhY9#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=d»%„à…ÿ„Ø¡à±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡ä±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡ä±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡à±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=Ô±%…Ρر%€€€€€€‰ÃÁã‹ +ܱ%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡Ø±%‰¡Ü±%éqvƒø…ç¶ı%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +б%f)Ù·É +à±%º×®¬]‰È÷êÁú‰ÈÁø)Âä±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£à±%f‰б%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡ä±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹à±%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+‰ð™‰È)Ћ +ä±%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=Ô±%…rUè¡Ø±%‰¡Ü±%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð·`»%9Æv%hf9#j_hx9#h9#èm%Ç$èmƒÄ·`»%)ó¯ȱ%·`»%‰Ø‰Ñº÷ñ‰Ãº °
+îì©t‹ +ȱ%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡Ø±%€€€€€€Áà‰Eä‹ +ܱ%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿŒ^#ƒ=Œ^#uƒ=h^#tÿh^#¶E÷€Áຌ°%ƒ<uIÇö€°%tûƒì ¶]÷›Áã¾€°%ÿ43ÿ“„°%ƒÄöDtú¶E÷€Ç…Œ°%ÿp^#ƒ=Œ^#uƒ=l^#tÿl^#ÿ +Œ^#eø[^]ÍvU‰åWVSº¿Œ°%¾ˆ°%»„°%¹€°%’ÁàÇ8‰0ÇÇBƒú~ÜÇŒ^#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…Œ°%t÷Æu¸ÿÿÿÿëH’ …ǁŒ°%û…Ût‰™„°%º€°%ˆ°%‰‰t
+됍’Ç…Œ°%¸[^]ÐU‰å¡Œ^#]ÉöU‰åSƒì¶ı%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +б%f)Ù·É +à±%º×®¬]‰È÷êÁú‰ÈÁø)Âä±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ +à±%f‰б%ÿŒ^#ƒ=Œ^#uƒ=h^#tÿh^#¡Ü±%‰Ã$Å#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êر%’’’’’’’’’Á⠉Ø)Уܱ%‹À±%ë$‹¡Ì±%‰‰̱%‰À±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;ر%;ر%uƋB;ܱ%~»ƒ=Œ^#uƒ=l^#tÿl^#ÿ +Œ^#‹]üÉÃU‰åWVSƒì‹uhtÔ"j@èØ +ƒÄƒ>t,ƒì h™9#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hµ9#è³ ‹N‰ +ȱ%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ +`»%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£Ô±%ƒ=ÄA&~»A¹C°p‰ÊÚîîÆı%ë%Æı%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾²%»²%ƒùbIÁà²%‰0I‰LÃAƒùc~ßÇH»%Ç̱%²%Çh^#Çl^#¡È±%€€€Áà£$Å#Çܱ%Çر%Çà±%Çä±%fÇб%ƒ=Ô±%uǤá#dË"Ǩá#üË"ëÇ¤á#LÌ"Ǩá#ØÒ"eô[^_]ÃU‰å‹E£h^#]ÍvU‰å‹E£l^#]ÍvU‰å‹E£x^#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=̱%tl‹ +̱%‹£Ì±%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹À±%}è‹uè됋…Òt‰ð;B  +;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ +À±%‰‹AƒÄ [^_]ÐU‰å‹E¹‹À±%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+‹£À±%됋‰¡Ì±%‰‰̱%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=̱%„q‹5̱%‹£Ì±%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹À±%}è‹Mè됋…Ût‰È;C  +;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5À±%ƒ=d»%…ôƒìEàPjè3óÿÿ‹À±%ƒÄ‹Eà;B  +;B u‹Eä;B~ÇEÜÇEØëK}؋À±%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡À±%‹@ +EàH‰EØ¡À±%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶ı%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹б%f)Ú·Ò‰Ö5à±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +ä±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰à±%f‰б%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=À±%„/Çd»%‹À±%‹Eè;B ;B …Œ‹C;BŽ€ƒ=Œ^#uƒ=h^#tÿh^#ÿŒ^#‹À±%ë#‹¡Ì±%‰‰̱%‰À±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè +;EèűB;Eì~ă=Œ^#uƒ=l^#tÿl^#ÿ +Œ^#¶ı%ƒøt"ƒø …Àt +ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹б%f)Ú·Ò‰Ö5à±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +ä±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰à±%f‰б%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹À±%‹Mè;J 
+;J u;B~ÇEäÇEàëJ]à‹À±%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡À±%‹@ +EèH‰Eà¡À±%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇd»%ë +‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹À±%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£À±%»ë‹‰¡Ì±%‰‰̱%ƒ=d»%…ƒ=À±%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹À±%ƒÄ‹Eð;B  +;B u‹Eô;B~ÇEìÇEèëJ]è‹À±%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡À±%‹@ +EðH‰Eè¡À±%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼(Õ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡t^#@£t^#1ÛfŒÓü¡Ô±%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡|^#f9‚^#t f£‚^#ÿ-~^#ƒ=x^#t‹x^#ÿÓf©f¡ffaωöU‰å‹EØf£‚^#f£|^#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;‚^#t f£‚^#ÿ-~^#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡8\#]ÉöU‰å]ÍvU‰åSƒì‹8\#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=*\#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMè*\#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹@_#fÇD
+8ƂE_#îƂD_#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+ˆ^#ë7fƒùw<·Éƒé¸Óà
+‰^#¢‰^#º¡î<ÿu ˆ^#©uƒÈ¢ˆ^#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"ˆ^#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"‰^#¢‰^#º¡î ˆ^#©t%û¢ˆ^#º!î]ÉöU‰å¿|^#]ÃU‰åƒì‹Ef£|^#˜PèWüÿÿƒÄÉÐU‰å¿|^#]ÃU‰åƒì‹E‰Âf£|^#ƒ=Œ^#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹”^#ºÔ^#‰öµÇ”Ü"Ç”Ü"Fƒþ~åƒì EÈPèÅèºÇÀA&:#‹EÈ£ÄA&¶^#£ÈA&ƒÄ‹EУÐA&‹EÔ£ÔA&‹EØ£ØA&h=Þ"jè£ýÿÿƒÄhGÞ"jè”ýÿÿƒÄhQÞ"jè…ýÿÿƒÄhXÞ"jèvýÿÿƒÄh_Þ"jègýÿÿƒÄhfÞ"jèXýÿÿƒÄhmÞ"jèIýÿÿƒÄh³Þ"jè:ýÿÿƒÄhtÞ"jè+ýÿÿƒÄh{Þ"j èýÿÿƒÄh‚Þ"j
+è +ýÿÿƒÄh‰Þ"j èþüÿÿƒÄhÞ"j èïüÿÿƒÄh—Þ"j +èàüÿÿƒÄhžÞ"jèÑüÿÿƒÄh¥Þ"jèÂüÿÿƒÄh¬Þ"jè³üÿÿƒÄhlÝ"jAè¤üÿÿƒÄhtÝ"jBè•üÿÿƒÄh|Ý"jCè†üÿÿƒÄh„Ý"jDèwüÿÿƒÄhŒÝ"jEèhüÿÿƒÄh”Ý"jFèYüÿÿƒÄhœÝ"jGèJüÿÿƒÄh¤Ý"jpè;üÿÿƒÄh¬Ý"jqè,üÿÿƒÄh´Ý"jrèüÿÿƒÄh¼Ý"jsèüÿÿƒÄhÄÝ"jtèÿûÿÿƒÄhÌÝ"juèðûÿÿƒÄhÔÝ"jvèáûÿÿƒÄhÜÝ"jwèÒûÿÿf +4A&€¾ƒÄvÀÅ ½%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿@A&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=ÄA&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•Ô^#]ÉöU‰å‹U‹E ‰•”^#]ÉöU‰åƒìhà9#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƐ^#Ûã¹âþfÇ’^#ZZÝ=’^#¹âþf¡’^#<u+Ù=’^#¹âþf¡’^#f%?fƒø?uƐ^#Ɛ^#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë(`¸ ë `¸ ë`¸ +ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…”^#ÿÓ[° ƒûrº îº îf¡|^#f;‚^#t f£‚^#ÿ-~^#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ëI¸ ëB¸ ë;¸ +ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=*\#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…Ô^#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿_#È·À-yƒÀÁø9ÂtU¿_#@ÀÝ4Ō½%›È·À-yƒÀÁøf£_#¿5_#¿B&4v4ö4õŒ½%¹üó¥Ý%B&^_]ÉöU‰å¿_#]ÃU‰åWVSƒì(ŠM¡_#Áà ˜€ f¶nB&f£*Õ#f¶mB&f£,Õ#€ù t%€ù €ù„óé‰ö€ù
+„#é‰öfƒ*Õ#·*Õ#;pB&Œ½fÇ*Õ#·,Õ#¡tB&H9Â…¿¡pB&H‰Eì‰Uèf¾lB&Áâf‰Uò¡_#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯pB&Èf‹]òf‰FA;Mì~çé)‰öfÇ(Õ#·*Õ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰(Õ#f¡(Õ#f£*Õ#éævfÇ*Õ#·,Õ#¡tB&H9Â…¾¡pB&H‰Eà‰UÜf¾lB&Áâf‰Uæ¡_#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯pB&Èf‹]æf‰FA;Mà~çé%‰öfÿ +*Õ#·*Õ#·,Õ#¯pB&ÂÆS fÿ*Õ#éõ‰ö·*Õ#·,Õ#¯pB&Ј Cfÿ*Õ#·*Õ#;pB&Ž¿fÇ*Õ#·,Õ#¡tB&H9Â…š¡pB&H‰EԉUÐf¾lB&Áâf‰UÚ¡_#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯pB&Èf‹]Úf‰FA;MÔ~çëfÿ,Õ#·5*Õ#·=,Õ#‰øf¯pB&f‰EΡ_#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆnB&‰ø¢mB&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯pB&f‰Eò¡_#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢nB&‰úˆmB&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡_#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯pB&È·G‰ð¯pB&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯pB&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡pB&H‰Eð‹tB&K‰]ìf¾lB&Áàf‰Eê¡_#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯pB&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰pB&¶„@£tB&¶„ÿ ¢lB&¶P¢nB&¶Q¢mB&¶`¢/Õ#¶a¢.Õ#Ç_#Ç_#]ÃU‰åWVSƒì nB&¢P mB&¢Q¶ÀP¶nB&PèŠýÿÿ¶.Õ#¶5/Õ#ƒÄ¹Ô°
+‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £_#¹Ô° +‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹_#Áâ»@Õ#¶nB&‰¹`Õ#¶mB&‰
+µŠ¢nB&Š
+¢mB&‰5_#[^]ÃU‰å¡_#]ÉöU‰å¡_#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯pB&¡_#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢mB&ŠE¢nB&ƒÄeô[^_]ÍvU‰åWVSƒì ¡pB&H‰Eð‹=tB&Of¾lB&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯pB&¡_#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆmB&ÆnB&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯pB&¡_#Áà ÂU”€ ˆ
+ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯pB&¡_#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯pB&¡_#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh:#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh€Õ#èX‰ÃÇ$€Õ#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh€×#謉ÃÇ$€×#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë +¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…€)#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë +vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäj
+VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} +ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…Ð*#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… ,#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìh(:#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìh5:#Wè¶öÿÿ‰ÇƒÄ EìPj
+됃ìh@:#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä +ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhX:#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} +‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèE ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(Ý`-#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý`-#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ`-#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý`-#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý`-#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E  _#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝh-#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝx:#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝx:#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5p-#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ€:#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿ܈:#Ü +p-#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝx-#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ýx:#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝx:#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf +? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh:#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh”:#Qè çÿÿƒÄ¸ë‰ö…Étƒìh™:#QèçÿÿƒÄ¸ÉÃU‰åƒì¸€Ù#ƒ=,_#tÿ,_#ÉÃU‰å‹E£,_#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èvÝ]èƒÄƒ=0_#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè8ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•-#ÝØÇEغž:#ƒøc~º£:#‰UÜÇEðÇEôƒ=0_#„}ƒì EØP誃ąÀ…uƒ=0_#…Yƒìjh©:#éëvÝØÇEغ½:#ƒøc~ºÂ:#‰UÜÇEðÇEôƒ=0_#„ƒì EØPè>ƒÄ…À… ƒ=0_#…íƒìjhÈ:#év‰]à‰uäÝ]èÇEغÜ:#ƒøc~ºâ:#‰UÜÇEðÇEôƒ=0_#„žƒì EØPè˃ąÀ…–ƒ=0_#…zƒìjhé:#é ÝØÇEغþ:#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïGé¸ +¡$_#‹(_#‰Eð‰Uôé¡ +‰öÝØÇEغ’<#ƒøc~º˜<#‰U܃=0_#uÇEðàÇEôÿÿïGéh +¡$_#‹(_#‰Eð‰UôéQ +‰öÝØÇEغ ;#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïGé +¡$_#‹(_#‰Eð‰Uôé +‰öÝØÇEغ ;#ƒøc~º;#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ—5#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„óƒì EØPè ƒÄ…À…ëƒ=0_#…σìjh;#éaÝØÇEغ—5#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„gƒì EØP蔃ąÀ…_ƒ=0_#…Cƒìjh;#éÕ +ÝØÇEغX5#ƒøc~º*;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„Û +ƒì EØPèƒÄ…À…Ó +ƒ=0_#…· +ƒìjh.;#éI +ÝØÇEغX5#ƒøc~º*;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„O +ƒì EØPè| +ƒÄ…À…G +ƒ=0_#…+ +ƒìjh.;#é½ ÝØÇEغ@;#ƒøc~ºC;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„à ƒì EØPèð ƒÄ…À…» ƒ=0_#…Ÿ ƒìjhG;#é1 ÝØÇEغ@;#ƒøc~ºC;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„7 ƒì EØPèd ƒÄ…À…/ ƒ=0_#… ƒìjhG;#é¥ ÝØÇEغY;#ƒøc~º`;#‰U܃=0_#uÇEðàÇEôÿÿïGéP ¡$_#‹(_#‰Eð‰Uôé9 ‰öÝØÇEغY;#ƒøc~º`;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=0_#…= ƒìjhh;#éÏ
+vÝØÇEغ|;#ƒøc~º€;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=0_#…¯
+ƒìjh…;#éA
+ÝØÇEغ|;#ƒøc~º€;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=0_#…#
+ƒìjh–;#éµ ÝØÇEغ©;#ƒøc~º¯;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„Íƒì EØPèè ƒÄ…À…³ ƒ=0_#…— ƒìjh¶;#é) ÝØÇEغ©;#ƒøc~º¯;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„/ ƒì EØPè\ ƒÄ…À…' ƒ=0_#… ƒìjhÉ;#靐ÝØÇEغÞ;#ƒøc~ºâ;#‰UÜÇEðÇEôƒ=0_#… ƒì EØPèòƒÄ…À…½ƒìjhç;#jèÚõÿÿèaõÿÿÇ!ƒÄ降vÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ +H=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡$_#‹(_#‰Eð‰Uô‰]ЉuÔÝEÐÜ +H=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡$_#‹(_#ò€‰Eð‰UôéòvÝØÇEغÞ;#ƒøc~ºâ;#‰UÜÇEðÇEôéÁ‰öÝØÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uÇEðÇEôë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„ãƒì EØPèƒÄ…À…Ûƒ=0_#…¿ƒìjhÿ;#éQÝØÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uÇEðÇEôëÇEðÇEôøƒ=0_#„`ƒì EØP荃ąÀ…Xƒ=0_#…<ƒìj h =#éΉöÇEغ<#ƒøc~º<#‰U܃=0_#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ +$_#‹(_#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغ$<#ƒøc~º)<#‰U܃=0_#uÇEðÇEôëÇEðÇEôøƒ=0_#„Lƒì EØPèyƒÄ…À…Dƒ=0_#…(ƒìjh/<#麉öÇEغC<#ƒøc~ºH<#‰U܃=0_#uÝ]ðëÝØÇEðÇEôøƒ=0_#„Òƒì EØPèÿƒÄ…À…ʃ=0_#…®ƒìjhN<#é@ÝØÇEغc<#ƒøc~ºm<#‰UÜÇEðÇEôøƒ=0_#„iƒì EØP薃ąÀ…aƒ=0_#…Eƒìjhx<#é׍vÝØÇEغ‘<#ƒøc~º—<#‰UÜÇEðÇEôøƒ=0_#„ýƒì EØPè*ƒÄ…À…õƒ=0_#…Ùƒìjhž<#ékvÝØÇEغ³<#ƒøc~º¹<#‰UÜÇEðÇEôøƒ=0_#„‘ƒì EØP较ąÀ…‰ƒ=0_#…mƒìjhÀ<#éÿvÇEغ³<#ƒøc~º¹<#‰UÜÜ5P=#Ý]ðƒ=0_#„,ƒì EØPèYƒÄ…À…$ƒ=0_#…ƒìjhÕ<#隉öÇEغè<#ƒøc~ºî<#‰U܋ +$_#‹(_#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغè<#ƒøc~ºî<#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=0_#…jé|vÝØÇEغõ<#ƒøcŽ•ºø<#鋍vÝØÇEغ—5#ƒøc~uº;#ën‰öÝØÇEغ =#ƒøc~Yº=#ëR‰öÝØÇEغX5#ƒøc~=º*;#ë6‰öÝØÇEغ=#ƒøc~!º=#ë‰öÝØÇEغ@;#ƒøc~ºC;#‰UÜÇEðÇEôƒ=0_#„¯ƒì EØPèʃąÀ…•ƒ=0_#…‹ƒìjÿuÜjè§îÿÿƒÄ jhü<#jè–îÿÿƒÄëfÝØÇEغZ;#ƒøc~ºa;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#tƒì EØPè2ƒÄ…À…ýè²íÿÿÇ"éívÝØÇEغZ;#ƒøc~ºa;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#„‰ƒì EØP趃Ä…À…ƒ=0_#uiƒìjhi;#jè•íÿÿƒÄëSÇEغÞ;#ƒøc~ºâ;#‰UÜÝ]ðƒ=0_#ÿt ƒ=0_#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÄìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhX=#hb=#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hX=#hm=#è` ƒÄöCtƒìjahX=#h =#èC ƒÄöC tƒìjbhX=#hà=#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhX=#h=#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh>#h>#èX ƒÄ‹F ;Cv‹F;C sƒìjmh>#h@>#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLhm>#hu>#èÙ
+ƒÄ…ÿuƒìjMhm>#h~>#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUhm>#hÀ>#è€
+ƒÄƒ~t‹F;F rƒìjUhm>#h ?#è[
+ƒÄ‹F +F9FvƒìjUhm>#h`?#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^hm>#h ?#èø ƒÄöCtƒìj_hm>#hà?#èÛ ƒÄƒ;t9wƒìj`hm>#h @#è» ƒÄ;^ rƒìjahm>#h–>#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwhm>#h­>#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThI@#hu>#èۃă} uƒìjUhI@#h~>#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hI@#hÀ>#舃ăt‹G;G rƒìj[hI@#h ?#ècƒÄ‹G +G9Gvƒìj[hI@#h`?#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷ÃtƒìjkhI@#h ?#èèƒÄöCtƒìjlhI@#hà?#è˃ă;t9wƒìjmhI@#h @#諃Ä;_ rƒìjnhI@#h–>#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hI@#hT@#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hI@#h€@#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´hI@#h­>#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]Sh²@#èaÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh@A#è1ÌÿÿƒÄ ƒ~uƒ~t‹F;FsƒìjahÄ@#hÀ>#袃ă~t‹F;F rƒìjahÄ@#h ?#è}ƒÄ‹F +F9FvƒìjahÄ@#h`?#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh€A#è“ËÿÿƒÄ ÷ÃtƒìjihÄ@#h ?#èƒÄöCtƒìjjhÄ@#hÀA#èóƒÄƒ{wƒìjkhÄ@#hË@#èփă;t9wƒìjlhÄ@#h @#趃Ä;^ rƒìjmhÄ@#h–>#蚃Ä{‹…Û…BÿÿÿƒìWhç@#èàÊÿÿƒÄ9~tƒìjshÄ@#hú@#è`ƒÄ‹6…ö…cþÿÿƒì hA#èªÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh[=#hu>#è ƒÄ…ÛuƒìjOh[=#hòA#èñƒÄƒ}uƒìjPh[=#h~>#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh[=#hýA#螃ă{uƒ{t‹C;CsƒìjYh[=#hÀ>#èsƒÄƒ{t‹C;C rƒìjYh[=#h ?#èNƒÄ‹C +C9CvƒìjYh[=#h`?#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh[=#h`?#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh[=#h B#諃ąöt8‹U:9ðr.9ðtƒìjuh[=#h`B#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h†B#hÀ>#蠃ă~t‹F;F rƒìj]h†B#h ?#è{ƒÄ‹F +F9Fvƒìj]h†B#h`?#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh†B#h ?#è$ƒÄöCtƒìjeh†B#hÀA#èƒÄƒ{wƒìjfh†B#hË@#èêƒÄƒ;t9wƒìjgh†B#h @#èʃÄ;^ rƒìjhh†B#h–>#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh†B#hú@#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh B#èºÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh Ù#èÈÿÿƒÄh Ù#ÿ5àá#jSVh C#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Ìá#jÿuÿu ÿuhàB#èƒÄ ÉÉöU‰åƒì E Pÿuh Ý#èÈÿÿƒÄ jjhh$#èè%ÿÿƒÄh Ý#hƒC#è†ÅÿÿÇ$MèBÿÿƒÄÉÐU‰åƒìh Ý#h`C#è_ÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л¤â#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»¨â#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åøâ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹xå#‰U苀|å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õxå#|[‰Eäv1‰ÐÁà)ЍÅ;šxå#u ‹Eì;‚|å#|1‰Ï‰ÐÁà)Ћ Åøâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åxå#}«ƒÿÿt‰ÐÁà)ЋU‰Åøâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜¬â#¿¨â#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»¬â#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õøâ#‰ƒøÿt@‰ÐÁà)ÐÇÅüâ#ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Åøâ#‹@‰ÂÁâ)‰ Õüâ#됉KI‰ÐÁà)ÐÇÅøâ#ÿÿÿÿI‰ÐÁà)ÐÇÅüâ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰Åüâ#‹C@‰ÂÁâ)‰ Õøâ#ë‰ö‰ I‰ÐÁà)ÐÇÅüâ#ÿÿÿÿI‰ÐÁà)ÐÇÅøâ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸¡C#됸¦C#됸ªC#됸°C#됸q4#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèH—ÿÿƒÄ ÿuìÿuèhÀC#èaÁÿÿƒÄ÷EtN¾;5Ðá#sA¿â#vƒì µ‹;¶BP·BPRVhD#èÁÿÿƒÄ‹;VÿP ƒÄF;5Ðá#rÇ÷Etƒì hÛC#èñÀÿÿèT&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöí"Üï"Üï"Üï"Üï"Üï"Hï"Üï"Tï"`ï"Üï"lï"lï"lï"lï"lï"lï"lï"lï"lï"lï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï" í"4í" î"`î"àî"<ï"4í"Üï"Üï"0ï"Üï"<ï"Üï"î"Üï"Üï"8î"Üï"€í"Üï"Üï"Ìí"Àð" ò" ò" ò" ò" ò"ò" ò"$ò",ò" ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò"Ìð"àð" ò" ò" ò" ò"àð" ò" ò"ò" ò" ò" ò" ò" ò" ò"Øñ" ò"0ñ" ò" ò"tñ"¬õ"¸õ"¸õ"¸õ"¸õ"¸õ"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¬ó"0ô",õ",õ",õ" õ"0ô"¸õ"¸õ"”õ"¸õ" õ"¸õ"¸õ"¸õ"¸õ"Äó"¸õ" ô"¸õ"¸õ"¼ô"$@$@#€#ì#\#¬#ü#L#|##”# #¬ #8
+#Ä
+# #œ #( #´ #@ +#Ì +#@#\#Œ##œ#,#°#(#”##l#Ð##`#„# #¼#Ø#ô#t#ì#t#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô##€#ì#\#¬#ü#L#|##”# #¬ #8
+#Ä
+# #œ #( #´ #@ +#Ì +#@#\#Œ##œ#,#°#(#”##l#Ð##`#„# #¼#Ø#ô#t#ì#t#TimerOthermain: unable to set timer 1
+main: unable to set timer 2
+main: unable to set timer 3
+main: waiting signals...
+main: disarm the timer2
+main: disarm the timer1
+main: arm timer1
+main: unable to arm timer 1
+main: ending...
+Signal %d code=%s value=%d task=%d count25=%d count26=%d time=%ldusec
+task_timer: value = %d, time = %ldusec
+main: unable to create timer 1
+main: unable to create timer 2
+main: unable to create timer 3
+main: unable to disarm timer 2
+main: timer2 disarmed, itvalue=%ld.%ld
+main: unable to disarm timer 1
+main: timer1 disarmed, itvalue=%ld.%ld
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ +Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+8Œÿÿ’ÏÿÿšÏÿ(T#ÿ@_#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#P\#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +4#4#ÿ3#ø3#ñ3#ê3#ã3#Ü3#T}"\}"\}"39#&9#9#9#ì8#Ö8#Æ8#²8#£8#“8#†8#q8#`8#F8#:8#“8#'8#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAšg:#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€€)!€)#*¨ )(T#¨D /4_#ÀO5@_#ÀO8ã :ÀOLC ahtgI
\ No newline at end of file
/branches/pj/pse51/ptest3
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest3.c
===================================================================
--- branches/pj/pse51/ptest3.c (nonexistent)
+++ branches/pj/pse51/ptest3.c (revision 1085)
@@ -0,0 +1,229 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest3.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 3:
+
+ timers...
+ it creates two periodic timers that queues signals, a periodic timer
+ that create tasks and an one-shot timer.
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <time.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+int count25 = 0, count26 = 0;
+
+void signal_handler(int signo, siginfo_t *info, void *extra)
+{
+ switch (signo) {
+ case 25:
+ count25++;
+ break;
+ case 26:
+ count26++;
+ break;
+ }
+
+ cprintf("Signal %d code=%s value=%d task=%d count25=%d count26=%d time=%ldusec\n",
+ info->si_signo,
+ (info->si_code == SI_TIMER) ? "Timer" : "Other",
+ info->si_value.sival_int,
+ info->si_task,
+ count25,
+ count26,
+ sys_gettime(NULL));
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+void task_timer(union sigval value)
+{
+ cprintf("task_timer: value = %d, time = %ldusec\n",
+ value.sival_int, sys_gettime(NULL));
+}
+
+int main(int argc, char **argv)
+{
+ int err;
+ timer_t timer1, timer2, timer3;
+ struct itimerspec timeout1, timeout2, timeout3, nulltimeout;
+ struct sigaction sig_act;
+ struct sigevent ev25, ev26, evtask;
+ pthread_attr_t task_attr;
+ struct sched_param task_param;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ sig_act.sa_sigaction = (void *) signal_handler;
+ sig_act.sa_flags = SA_SIGINFO;
+ sigemptyset(&sig_act.sa_mask);
+
+ sigaction(25, &sig_act, NULL);
+ sigaction(26, &sig_act, NULL);
+
+ // set ev25, ev26, evtask
+ ev25.sigev_notify = SIGEV_SIGNAL;
+ ev25.sigev_signo = 25;
+ ev25.sigev_value.sival_int = 555;
+
+ ev26.sigev_notify = SIGEV_SIGNAL;
+ ev26.sigev_signo = 26;
+ ev26.sigev_value.sival_int = 666;
+
+ evtask.sigev_notify = SIGEV_THREAD;
+ evtask.sigev_value.sival_int = 777;
+ evtask.sigev_notify_function = task_timer;
+ evtask.sigev_notify_attributes = &task_attr;
+
+ pthread_attr_init(&task_attr);
+ pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
+ pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
+ task_param.sched_priority = 10;
+ pthread_attr_setschedparam(&task_attr, &task_param);
+
+ // set timeout1, timeout2, nulltimeout
+ timeout1.it_interval.tv_sec = 0;
+ timeout1.it_interval.tv_nsec = 500000000;
+ timeout1.it_value.tv_sec = 3;
+ timeout1.it_value.tv_nsec = 0;
+
+ timeout2.it_interval.tv_sec = 0;
+ timeout2.it_interval.tv_nsec = 200000000;
+ timeout2.it_value.tv_sec = 7;
+ timeout2.it_value.tv_nsec = 0;
+
+ timeout3.it_interval.tv_sec = 0;
+ timeout3.it_interval.tv_nsec = 300000000;
+ timeout3.it_value.tv_sec = 5;
+ timeout3.it_value.tv_nsec = 0;
+
+ NULL_TIMESPEC(&nulltimeout.it_value);
+ NULL_TIMESPEC(&nulltimeout.it_interval);
+
+ // create the timers
+ err = timer_create(CLOCK_REALTIME, &ev25, &timer1);
+ if (err == -1) { cprintf("main: unable to create timer 1\n"); }
+
+ err = timer_create(CLOCK_REALTIME, &ev26, &timer2);
+ if (err == -1) { cprintf("main: unable to create timer 2\n"); }
+
+ err = timer_create(CLOCK_REALTIME, &evtask, &timer3);
+ if (err == -1) { cprintf("main: unable to create timer 3\n"); }
+
+ // arm the timers
+ err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
+ if (err == -1) { cprintf("main: unable to set timer 1\n"); }
+
+ err = timer_settime(timer2, 0, &timeout2, NULL);
+ if (err == -1) { cprintf("main: unable to set timer 2\n"); }
+
+ err = timer_settime(timer3, TIMER_ABSTIME, &timeout3, NULL);
+ if (err == -1) { cprintf("main: unable to set timer 3\n"); }
+
+ cprintf("main: waiting signals...\n");
+ while (sys_gettime(NULL) < 8500000) {
+ //kern_deliver_pending_signals();
+ }
+
+ cprintf("main: disarm the timer2\n");
+ err = timer_settime(timer2, 0, &nulltimeout, &timeout2);
+ if (err == -1) { cprintf("main: unable to disarm timer 2\n"); }
+
+ cprintf("main: timer2 disarmed, itvalue=%ld.%ld\n",
+ timeout2.it_value.tv_sec,timeout2.it_value.tv_nsec/1000);
+
+ while (sys_gettime(NULL) < 10000000) {
+ //kern_deliver_pending_signals();
+ }
+
+ cprintf("main: disarm the timer1\n");
+ err = timer_settime(timer1, TIMER_ABSTIME, &nulltimeout, &timeout1);
+ if (err == -1) { cprintf("main: unable to disarm timer 1\n"); }
+
+ cprintf("main: timer1 disarmed, itvalue=%ld.%ld\n",
+ timeout1.it_value.tv_sec,timeout1.it_value.tv_nsec/1000);
+
+ while (sys_gettime(NULL) < 12000000) {
+ //kern_deliver_pending_signals();
+ }
+
+ cprintf("main: arm timer1\n");
+ timeout1.it_interval.tv_sec = 0;
+ timeout1.it_interval.tv_nsec = 0;
+ timeout1.it_value.tv_sec = 13;
+ timeout1.it_value.tv_nsec = 0;
+ err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
+ if (err == -1) { cprintf("main: unable to arm timer 1\n"); }
+
+ while (sys_gettime(NULL) < 14000000) {
+ //kern_deliver_pending_signals();
+ }
+
+
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/ptest4
===================================================================
--- branches/pj/pse51/ptest4 (nonexistent)
+++ branches/pj/pse51/ptest4 (revision 1085)
@@ -0,0 +1,418 @@
+ELF"4ˆi4 ( €""¨E¨E (F¨U#¨U# 0ó 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸ë"fe£ÈU#Áèfe£ÎU#¨]#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼Àˆ#ÇpÃ%Àh#ÇtÃ%Àˆ#£´]#‰¸]#¨]#êµ"8®]#üèž×ê U‰å‹Eê ‰öU‰åSƒì<ÆEÙxÆEÚ-ÆEØhD"ƒì‹EØf‰$ÆD$-è|ÇEô("ÇEð]èEì‰$è˜pƒÄ jSjèƒ[Ç$L3#èóêjhx"jEÔPèURƒÄ …Àtƒì h_3#èÍêƒÄƒì hr3#è½êjhx"jEÐPèRƒÄ …Àtƒì h…3#è—êƒÄƒì h˜3#è‡êjhx"jEÌPèéQƒÄ …Àtƒì h«3#èaêƒÄƒì h¾3#èQêƒÄ‰öƒì jèv<ƒÄ=?Bvìƒì h3#è+êƒÄjÿuÔè‚YƒÄvƒì jèB<ƒÄ=„vìƒì hÓ3#è÷éƒÄÿuÐèSÇ$í3#èà鸃Ä‹]üÉÍvU‰åƒìÿ5Lã#h@2#èºéƒÄÉÐU‰åWVSƒì4ÿ5Lã#h€2#è›éÇEЍ}ÐÇGuÈÇFÇEÈÇEØ\"ÇEÜÇ$è×=‰Ã‹‰EàE؉ƒÄVWèK‰Ç‹Uà‰‹NºÓMb‰È÷êÁúÁù)ʉ$ÿuÈWÿ5Lã#hÀ2#èé¸ƒÄ eô[^_]ÍvU‰åƒìÿ5Lã#h43#èîèƒÄÉÐU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èõƒè¨è/±è^·èٝƒÄ jjjè§Qè–{¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾¼]#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjèàP‰EÐÇEÜÇEàƒMÌ
+è~¡E¨‰$ècƒÄ…Àyƒì h4#ècèƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=Ì^#„¶€ú*t€úªt
+€ú6t€ú¶uÆÌ^#¸é›„Òy,ÆÌ^#€ú¸uÆØ^#ÆÎ^#ëՀúuÐÆØ^#ëljöÆÌ^#€ú8u€ +Ø^#ÆÎ^#멀úu € +Ø^#뛉ö€ú5uf¾u‰#·Àé)v€ú…•f¾\‰#·Àé +v€úàuÆÌ^#éTÿÿÿv€ú*t€ú6u2ÆÍ^#€ú*u€ +Ø^#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ +Ø^# éÿÿÿv€úªt€ú¶u"ÆÍ^#€úªt €ú¶…öþÿÿÆØ^#éêþÿÿ€úFu€=Ñ^#•Ñ^#ë.v€ú:u€=Ï^#•Ï^#ëv€úEu;€=Ð^#•Ð^#ƒì¶Ñ^#P¶Ï^#P¶Ð^#Pèõ¸ƒÄé€úu€ +Ø^#éhþÿÿv€ú8u€ +Ø^#éTþÿÿv€út€ú¸uÆØ^#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+€úHt€úIu€=Ð^#uT€=Í^#uK·Â +ÿë~€=Ï^#t/Bð< vBâ<vBÔ<w€=Í^#t¶Âf¾€@‰#·ÀëG€=Í^#t¶Âf¾€à‰#·Àë-v€=Î^#t¶Âf¾€€Š#·Àëv¶Âf¾€@‰#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  Ø^#ƒÈ@ë‰ö Ø^#ˆE؈UيE׈EÚ±»;8‰#}8¾Àˆ#v݊D2:EÚuŠ2:EØuƒì Wÿ’Ĉ#±ƒÄC;8‰#|ЄÉuƒìjW¿‹#P襦ƒÄè-é<ÿÿÿU‰å‹E£È^#ŠˆB‰#ŠPˆC‰#ŠPˆD‰#ŠPˆE‰#ŠPˆF‰#ŠPˆG‰#ŠPˆH‰#ŠPˆI‰#ŠPˆJ‰#ŠP ˆK‰#ŠP
+ˆâ‰#ŠP ˆã‰#ŠP ˆä‰#ŠP +ˆå‰#ŠPˆæ‰#ŠPˆç‰#ŠPˆè‰#ŠPˆé‰#ŠPˆê‰#ŠPˆë‰#ŠPˆL‰#ŠPˆì‰#ŠPˆM‰#ŠPˆí‰#ŠPˆZ‰#ŠPˆú‰#ŠPˆ[‰#ŠPˆû‰#ŠPˆg‰#ŠPˆŠ#ŠPˆh‰#ŠPˆŠ#ŠP ˆi‰#ŠP!ˆ Š#ŠP"ˆu‰#ŠP#ˆŠ#ŠP$ˆs‰#ŠP%ˆŠ#ŠP&ˆt‰#ŠP'ˆŠ#ŠP(ˆk‰#ŠP)ˆ Š#ŠP*ˆy‰#ŠP+ˆŠ#ŠP,ˆN‰#ŠP-ˆî‰#ŠP.ˆO‰#ŠÖˆï‰#ŠP0ˆA‰#ŠP1ˆá‰#ŠP2ˆ\‰#ŠP3ˆü‰#ŠP4ˆDŠ#ŠP5ˆ/Š#ŠP6ˆ0Š#ŠP7ˆ1Š#ŠP8ˆ+Š#ŠP9ˆ,Š#ŠP:ˆ-Š#ŠP;ˆ'Š#ŠP<ˆ(Š#ŠP=ˆ)Š#ŠP>ˆ2Š#ŠP?ˆ3Š#ŠP@ˆŽ‰#ŠPAˆw‰#ŠPBˆu‰#ŠPCˆŠ‰#ŠPDˆ.Š#ŠPEˆŠ#ŠPFˆ*Š#ŠPGˆ^‰#ŠPHˆþ‰#ŠPIˆp‰#ŠPJˆŠ#ŠPKˆn‰#ŠPLˆŠ#ŠPMˆ`‰#ŠPNˆŠ#ŠPOˆR‰#ŠPPˆò‰#ŠPQˆa‰#ŠPRˆŠ#ŠPSˆb‰#ŠPTˆŠ#ŠPUˆc‰#ŠPVˆŠ#ŠPWˆW‰#ŠPXˆ÷‰#ŠPYˆd‰#ŠPZˆŠ#ŠP[ˆe‰#ŠPRˆŠ#ŠP]ˆf‰#ŠP^ˆŠ#ŠP_ˆr‰#ŠP`ˆŠ#ŠPaˆq‰#ŠPbˆŠ#ŠPcˆX‰#ŠPdˆø‰#ŠPeˆY‰#ŠPfˆù‰#ŠPgˆP‰#ŠPhˆð‰#ŠPiˆS‰#ŠPjˆó‰#ŠPkˆ_‰#ŠPlˆÿ‰#ŠPmˆT‰#ŠPnˆô‰#ŠPoˆV‰#ŠPpˆö‰#ŠPqˆo‰#ŠPrˆŠ#ŠPsˆQ‰#ŠPtˆñ‰#ŠPuˆm‰#ŠPvˆ +Š#ŠPwˆU‰#ŠPxˆõ‰#ŠPyˆl‰#ŠPzˆ Š#ŠP{ˆšŠ#ŠP|ˆ›Š#ŠP}ˆ§Š#Š@~¢¨Š#]ÍvU‰åWVSƒì\‹]}ؾà^#ü¹󥿸ƒ=Ô^#…Qº¾@‰#¹à‰#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇCÈ]#ƒì ÿsèûÿÿÇ$jjjh94#èw™f£‹#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjh94#è؜f£‹#ƒÄfƒøÿuƒì ¿‹#Pè= ¸ýÿÿÿ頍vÇ8‰#ƒ{ÿuÇC4"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+ÇE̍E¨ë‹ƒì jjPh<"hB4#èÿ‰ÃƒÄ ‰‹#ƒøÿu'ƒì ¿‹#Pè;Ÿ¿‹#‰$è,Ÿ‰Ø钐ƒ=Ü^#uWƒì ÿ5‹#艉ǃąÿt4ƒì ¿‹#Pèôž¿‹#‰$è垃Äÿ5‹#èg5¸üÿÿÿë=ÇÜ^#ëèƒì¶Ñ^#P¶Ï^#P¶Ð^#PèûÇÔ^#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿‹#PèØ ƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿‹#P蝠·ÀƒÄÉÐU‰åSƒ=8‰#0‹ +8‰#Í»Àˆ#‹Ef‰ŠE
+ˆD‹E ‰‚Ĉ#A‰ +8‰#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=Ô^#t9蓃ì ÿ5‹#è-4¿‹#‰$莝¿‹#‰$蝸ƒÄÉÐU‰åƒìjèÙÇ$èÓØÇ$(4#è›Øè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t +‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t +‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.Æì^#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐Æì^#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=ì^#„þÆì^#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆì^#¸eô[^_]ÃU‰åVS¡_#…Àt¡_#H£_#¸é²¸ë6ƒ=ø^#uKŠü^#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿø^#뤍v¸ë:ƒ=ø^#uGÇø^#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡_#@£_#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆí^#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=ì^#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡_#@£_#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆí^#¸eô[^_]ÍvU‰åƒìÇ$Œ#Ç Œ#ƒ=ô^#t!úè‹õÿÿ£ð^#Çô^#û…Àtúèôÿÿû¡ð^#…Àuƒìÿuh ""jè½U¸ƒÄÉÍvU‰åVS¡_#@£_#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡_#@£_#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡ Œ#@%ÿ£ Œ#Š€ ‹#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ= _#t(Ç„Œ#Ç€Œ#LjŒ#Ç _#‹E£_#ƒ=ô^#t!úèôÿÿ£ð^#Çô^#û…Àtúèòÿÿû¡ð^#…Àu.¸ìÿÿÿ€=ì^#t ƒìjÿh\""j è'TÆí^#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡€Œ#@ƒà?£€Œ#º@Œ#ŠˆA¡€Œ#@ƒà?£€Œ#Šˆ¡€Œ#@ƒà?£€Œ#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=í^#tèäùÿÿƒì j è6TÆí^#¸ƒÄÉÐU‰åƒìƒ=ô^#t!úè óÿÿ£ð^#Çô^#û…Àtúè™ñÿÿû¡ð^#…Àt¸ë¶ì^#ÉÍvU‰åVSŠEŠU€} t ƒ +ü^#ë ‰öƒ%ü^#„Àt ƒ +ü^#ëƒ%ü^#„Òtƒ +ü^#ë¸ë6¸ëbƒ%ü^#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿø^#[^]ÐU‰åSƒìœúX‰Ã€=í^#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡ Œ#;$Œ#t¡$Œ#ˆˆ ‹#@%ÿ£$Œ#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=ˆŒ#u €úúu¡_#H£_#郍v÷ÂÀuxÿˆŒ#œúX‰Á¡€Œ#;„Œ#t¡„Œ#ˆ@Œ#@ƒà?£„Œ#ë"‰ö¡„Œ#+ˆŒ#ƒÀAƒà?£„Œ#LjŒ#‰ÈPƒ=ˆŒ#uLjŒ#ƒì ÿ5_#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ÅHä#uè¡âNj¸ÿÿÿÿ鏐ƒ= ã#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€!ä# t ÿ€$ä#ë-v‹EÑàE‰ÂÁâ)‹Õ$ä#ƒì‹•€ã#ÿuRÿP@ƒÄ‰ØPéè+¦…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€!ä# t ÿ€$ä#ë2v‹EÑàE‰ÂÁâ)‹Õ$ä#ƒì‹•€ã#ÿuRÿP@蔃ĉØPé­úèò¶‹Lã#R‰ÑÁá)Ñ» ä#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€$ä#ë?vƒìU‰ÐPjÿL_#‹MI‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#QRÿP@è/ƒÄ¡Lã#@‰ÂÁâ)ƒì ¿Õ(ä#Pè`¶èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuèæànj¸ÿÿÿÿé"‰öƒ= ã#„“œúX‰ÇÇEð}ð™s¾ ä#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€$ä#ë6ƒìEðPjÿL_#‹MðI‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰öè;¤…À„›œúX‰ÇÇEð}ð™w¾ ä#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€$ä#ë8vƒìEðPjÿL_#‹MðI‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúèÊ´‹Lã#R‰ÑÁá)Ñf‰Í(ä#ÇEð}ð™w¾ ä#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€$ä#ë8v‹MðI‰ÐÁà)ЋÅ$ä#ƒì‹•€ã#QRÿP@ƒÄEðPjÿL_#ƒÄÿEð}ð™~èÞ ¡Lã#@‰ÂÁâ)ƒì ¿Õ(ä#Pè´èÁƒÄû¸eô[^_]ÃU‰åSƒìúè㳋Lã#R‰ÑÁá)Ñf‰Í(ä#ƒìhä#j蛃čUð¡ä#;Xã#|¡ä#+Tã#‰Eð¡ä#+Xã#ë!‰ö¡ä#+Tã#H‰Eð¡ä#+Xã#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì Qè. ƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRLè{ ƒÄhLã#jÿL_#ÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿèV ¡Lã#@‰ÂÁâ)¿Õ(ä#‰$苲è:ƒÄû‹]üÉÐU‰åƒìhà("èФƒÄÉÍvU‰åƒìj軤ƒÄÉÉöU‰åƒìƒ=_#u(èè
+ƒì ¡Lã#@‰ÂÁâ)¿Õ(ä#P貃ÄÉÍvU‰åWVSƒìhJ4#è)ƒÄ» ä#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hÄã#èr0‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾ ä#¡_#‰3@£_#‹E ‰Dƒìjÿuƒ4ä#PèHÃÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B +‰ƒ ä#¿$ä#Ç;¾(ä#¡Lã#@‰ÂÁâ)‹DÖ0‰3º,ä#ǍAP‹]ð‰˜ ä#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁ€ä#°Ç8Ç0ǁÁÀǁ ä#Ç9ºۍƒ€ 
+Ç…„ä#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂ(ä#ÿÿÿÿǂ,ä#tä#‰ðä#º‹Mðɍ€ ‰ö
+Ç…ðä#Bƒú~ì»ëC;Pã#sƒì‹€ã#ÿuSÿPƒÄ…Àxß;Pã#u7‹]ð[‰ÂÁâ)ÂfÇÕHä#ƒìhÄã#Sè‚.èIÚDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnž$ä#ƒì‹€ã#ÿuÿuðSÿP,ƒÄ…ÀyWfdžHä#ƒìhÄã#ÿuðè".èéÙDžë'èÛÙǃ釃ì ÿuðè9èÀÙdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5Dã#s0ƒìµ‹ƒàã#WVÿP ƒÄ…Àxۃ싃àã#WÿuðVÿP$ƒÄ;5Dã#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õ,ä#‰Æ‹UÑâU‰ÐÁà)Ѓ ÅPä#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅNä#Pè@‹UÑâU‰ÑÁá)Ñ»,ä#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèsØLjëtv‹EÑàE‰ÂÁâ)» ä#·DÓ.ƃì ·GPjÿwVhÌ/"èՑ‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèý×lj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õ(ä#ƒìU‰ÐPjÿL_#ƒÄöGu ÿ@ã#ëvöGuÿä#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅ$ä#‹…€ã#ƒx(„èà…À‰€»;Dã#svƒì‹àã#VSÿP(ƒÄC;Dã#råv‰ÃÁã)ÃÁ㋃$ä#ƒì‹…€ã#VPÿR0fǃHä#ƒÄhÄã#Vè+ƒÄèÈÖLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;Dã#svƒì‹àã#VSÿP(ƒÄC;Dã#råv‰ÃÁã)ÃÁ㋃$ä#ƒì‹…€ã#VPÿR0fǃHä#ƒÄhÄã#VèT*ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Lã#@‰ÂÁâ)¾ ä#SÿTÖú‰$èn¡Lã#@‰ÂÁâ)¿DÖ‰$諃čeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁຠä#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸$ä#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹(ä#‰Mì‹Uä‹
+‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…„ä#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ +Lã#I‰ÐÁà)ЍÅö‚Pä#tɍ€È‚Øä#…„ä#¡ä#;Tã#|;Tã#uA¡ä#;Xã#}4ƒìSÿ5Lã#ÿ5Xã#ÿ5Tã#ÿ5ä#ÿ5ä#h`4#èàºƒÄ è@ ‹]üÉÍvU‰åWVS‹ +Lã#I‰ÐÁà)ЍÅöƒPä#„›ɍ€ȍ‹°(ä#º$ä#‹t‚`‹”À¸,ä#94s‰4‹Lã#[‰ÁÁá)ÁÁፁÀ° ä#¿$ä#B‰8±°‹†(ä#@º‰Ñº÷ñ‰–(ä#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁຠä#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õàä#‰…ötI‰ÂÁâ)‹ÕÜä#‰…ÿtI‰ÂÁâ)‹Õää#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕØä#‹…„ä#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁຠä#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ ä#ǀ$ä#ǂÜä#û¸]ÍvU‰åWVSƒì ƒ=Lã#ÿt¡Lã#@‰ÂÁâ)ÂöÕPä#…3ƒ=Lã#ÿ„ƒìhä#jèUŽƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë"v¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QènüÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)Ћ<Å$ä#ƒì‹½€ã#QWÿP<ƒÄ¿4½ƒì ‹†€ã#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅ$ä#‹…€ã#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Lã#‰`ã#‰Lã#[‰ÐÁà)Ð;Åpä#t0» ä#‰ö¡Lã#@‰ÂÁâ)‹TÓP‰Lã# R‰ÈÁà)È;TÃPu×;5Lã#tƒìhLã#jÿL_#ƒÄ‹ +Lã#I‰ÐÁà)ÐÁྠä#fÇD(‹¸$ä#ƒì‹½€ã#‹`ã#¸;Lã#•ÀPQWÿS8¡Lã#@‰ÂÁâ)ƒÄöDÖ1„Ü¡`ã#;Lã#…Ë¡ä#‰EèMè¡Lã#@‰ÂÁâ)»,ä#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5ä#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Lã#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjhø="ÿuìÿuèÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jè£<ƒÄ‰\ã#¡ä#£Tã#¡ä#£Xã#eô[^_]ÉöU‰åWVSƒìÇ°£%úÿuèD»ƒÄ¿$ä#¾ ä#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂ,ä#ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀ(ä#ǀ,ä#‚dä#Ç@Çǂlä#BP‰0Ç8ÇD`DŽÐ‚øæ#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀ(ä#ǀ,ä#ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀ(ä#ÿÿÿÿǀ,ä#ºۍƒ€ 
+DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹(ä#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ ¡%ÿÿÿÿ»™¹,ä#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇ|ä#ÿÿÿÿÇÄã#ÇHã#Ç@ã#Çä#Ç`ã#ÿÿÿÿÇLã#ÿÿÿÿÇ\ã#ÿÿÿÿÇXã#ÇTã#ÇPã#ÇDã#Ç ã#èÚè}èÜ6ƒì ÿuèqÉÿÿ£Èã#ƒÄ=×Övƒì hÀ4#è5Ç$豿ƒÄ¸ƒ=Èã#”À‰Eè]è¡Èã#‰CÇ°£%èb‡ƒì SèY‘Ç$Œ>"è­ËÇ$Ì("è)“Ç$ä="è=“ƒÄjjèEÿT_#ƒÄhä#jèô‡èOùÿÿ蒠f£Àã#¡Lã#@‰ÂÁâ)¾ ä#¿DÖ‰$èw Ç$èߒÿP_#Ç°£%ƒÄ»ƒ=Hã#ŸÃSjèɃă=ä#teè„ Ç_#ƒìhä#jèc‡è f£Àã#è³øÿÿÇ$ä="èo’¡Lã#@‰ÂÁâ)¿DÖ‰$èߟÇ$èG’ƒÄÇ°£%ƒìSjèCèj†Ç°£%ƒÄjjè(ƒÄúƒ=Hã#t"ƒìÿ5Hã#hë4#èø°Ç$ÿÿÿÿ较ăì jèó½ƒÄeô[^_]ÃU‰åSƒìƒ=_#…•èÿ…Àuúè-Ÿ‹Lã#R‰ÑÁá)Ñf‰Í(ä#‹E£Hã#Ç_#ƒ=Lã#ÿ„ƒìhä#jè?†ƒÄUð¡ä#;Xã#|¡ä#+Tã#‰Eð¡ä#+Xã#ë ¡ä#+Tã#H‰Eð¡ä#+Xã#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QèZôÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿR<Ç`ã#ÿÿÿÿÇLã#ÿÿÿÿƒÄ褌…Àtƒì ¿Àã#PèԝƒÄëvƒì ¿Àã#P輝èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»º€ã#¡€ã#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwº€ã#‹šƒx(uи‹]üÉÉöU‰åƒìè èÀ/ÉÉöU‰åƒìÇ\ã#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=°£%tƒ=ä#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRj脉ƒĉØP‰Ð‹]üÉÉöU‰å¸Hã#ƒ=Lã#ÿt‹Lã#R‰ÐÁà)Ѝŀä#]ÉöU‰åSƒìœúX‰Ãƒ=°£%tƒ=ä#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹¨Œ#t[¿ Œ#ƒ<9tP‹Lã#ҍ‚€Ð؍…о ä#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Lã#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt +ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾ Œ#»¤Œ#¹¨Œ#vRÁàÇ0B‰Çƒú~ãǘ’#ÿÿÿÿÇ ’#ǨŒ#Ç Œ#ǤŒ#ÿÿÿÿ[^]ÐU‰åS‹Múƒ= ’#ÿu û¸ ënv¡ ’#@Ç•¨Œ#‰¡ ’#@‹…¤Œ#£ ’#‹@‹U ‰… Œ#º» ä#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Lã#À’ÂU‹•ðä#û]ÍvU‰å‹Múƒùw +Iƒ<…¨Œ#u û¸ë%v¡Lã#À’ÂʋE ‰•ðä#û¸]ÃU‰åS‹]œúX‰Áƒûw +[ƒ<…¨Œ#u‰ÈP¸ë.v[Áà‹ ’#‰¤Œ#ǀ¨Œ#‰ ’#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Lã#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿ ä#öD0 tm‹E‰‚ìä#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀº(ä#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃$ä#ƒì‹…€ã#VPÿRD‰tPƒÄ¹» ä#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Åtä#t[»$ä#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)» ä#¿DÓPè|~ƒÄEðPjÿL_#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õ,ä#èÁ ƒÄ»;Dã#sƒì‹àã#ÿuðSÿP(ƒÄC;Dã#rã‹MðI‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRPÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕPä#u&ÿ +@ã#ƒ=@ã#uBèZúÿÿë;ƒìRjè0ƒÄëg‹Eð@‰ÂÁâ)ÂöÕPä#uÿ +ä#ƒ=ä#uèúÿÿƒìhä#jèz~ƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁຠä#öD0ufƒ|(uèyÁNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅQä#tû雉ö;5Lã#uJv‰ÐÁà)л ä#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Lã#@‰ÂÁâ)¿DÓ‰$èM–ƒÄ»ëvC;_#}ƒìÝÿ°Ä’#VÿÀ’#ƒÄ…Àtٍv‰ÐÁà)Ё ÅPä#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…ÀuèŠÀnj¸ÿÿÿÿé‰öú¡`ã#@‰ÂÁâ)Âf‹Mòf; ÕLä#”Eñ¾¿ ä#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Lã#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;_#}ƒìÝÿ°Ä’#VÿÀ’#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡`ã#@‰ÂÁâ)¿Õ(ä#PèĔƒÄëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿ ä#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+uB»ë‰öC;_#}ƒìÝÿ°Ä’#VÿÀ’#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Lã#@‰ÂÁâ)» ä#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Lã#@‰ÂÁâ)¿DÓ‰$èʓƒÄ‹]üÉÉöU‰åS‹M‹] ¡_#ʼnŠÀ’#‰šÄ’#@£_#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Lã#@‰ÂÁâ)¿Õ(ä#‰$èb“ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=ô•#ÿuèð½Ç‚‰ØP¸ÿÿÿÿéۋ +ô•#‰ÊÁâ‹‚l“#£ô•#‹E‰‚`“#‹E ‰‚d“#‰ðƒà‰‚h“#‰ðƒàƒøtOƒø
+ƒøt +ësvƒøtSëi‰ÈÁàǀl“#ÿÿÿÿƒ=à•#ÿu‰ +à•#ë¡ä•#Áà‰ˆl“#‰ +ä•#ëH‰ö‰ÊÁâ¡è•#‰‚l“#‰ +è•#ë.‰ÊÁâ¡ì•#‰‚l“#‰ +ì•#ë‰ÊÁâ¡ð•#‰‚l“#‰ +ð•#‰ØP¸[^]ÐU‰åƒìƒ=Pã#uƒì h 5#è4 Ç$è°°ƒÄ¡Pã#P‰Pã#ÉÐU‰åƒìƒ=Dã#uƒì h?5#èøÇ$èt°ƒÄ¡Dã#P‰Dã#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿ蕶ÿÿƒÄeô[^_]ÉöU‰å¸¹l“#v‰ÂÁâ@‰
+ƒø&~òÇܕ#ÿÿÿÿÇà•#ÿÿÿÿÇä•#ÿÿÿÿÇè•#ÿÿÿÿÇì•#ÿÿÿÿÇð•#ÿÿÿÿÇô•#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹à•#Çà•#ÿÿÿÿë:‰ö‹è•#Çè•#ÿÿÿÿë&‰ö‹ì•#Çì•#ÿÿÿÿë‰ö‹ð•#Çð•#ÿÿÿÿÇ ã#ƒûÿtM¾l“#…ÿt‰ØÁàƒ¸h“#uƒì ‰ØÁàÿ°d“#ÿ`“#ƒÄ‰Ù‰ØÁà‹0‰Â¡ô•#‰2‰ +ô•#ƒûÿu¸Ç ã#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèñ‹Ç$–#èq؃Äjjhÿÿjh–#h–#èœÎƒÄjjhÿÿÿhh –#h–#è|΃Äjjhÿÿÿþhh<–#h–#è\ÎƒÄ ƒ}ütƒì‹EüHPÿuøh–#è&̓ă}ôtƒìÿuôÿuðh–#è
+̓ÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh–#è´ÎƒÄÉÍvU‰åƒìÿuÿuÿu ÿuh–#èdÐƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh–#è^ÐƒÄ ÉÐU‰åƒì ÿu ÿuh–#èՃÄÉÐU‰åƒìÿuh–#èù҃ÄÉÃU‰åƒìÿuh–#èùփÄÉÃU‰åƒì jÿuh–#èÿ̓ÄÉÉöU‰åƒì ÿu ÿuh–#èªÔƒÄÉÐU‰åƒìh–#è¸ÒÇ$–#èÌփÄÉÍvU‰åWVSƒì‹E@‰ÐÁà)Ðfƒ<ÅHä#…¿ƒìEèPjè½tƒÄ]àºÀ£%Mè‹u‹Dò;A|‹ò+Eè‰Eà‹Dò+A됸À£%‹M‹È+UèJ‰Uà‹DÈ+Eìʚ;‰CºÀ£%‹Eà‹u‰ò‹Eä‰Dòƒì v‰ÃÁã)ÃÁ㍻ྠä#ÿ47ÿ(ã#Ç7ÿÿÿÿ‹ƒ$ä#ƒÄ‹…€ã#ÿuPÿRD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì ‹u‹} ƒ>x ~ʚ;~ ¸é–úèvŒ‹Lã#R‰ÑÁá)Ñf‰Í(ä#ƒ=_#t+Ç_#ƒìjhHQ"èˆøÿÿƒÄjhŒM"è%ƒÄƒìhä#jèssƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë ¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QèŽáÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRH‹Lã# R‰ÈÁà)ÈfÇÅHä#ÕÀ£%ƒÄ¡ä#‰Ã‰¡ä#‰ÁN‰J…ÉyCÿ‰Êš;‰Bëzÿɚ;~ ÿjʚ;¡Lã#Ph¼Q"ÿ4ÅÄ£%ÿ4ÅÀ£%ÿ$ã#‰ÆƒÄƒþÿuƒìÿ5Lã#jè1#ƒÄ¡Lã#@‰ÂÁâ)» ä#‰´ÓàÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿèãÿÿ¡Lã#@‰ÂÁâ)ƒì ¿DÓPèIŠèøìÿÿƒÄûèÃ.¡Lã#Áàƒ¸À£%u ƒ¸Ä£%t)…ÿt¡Lã#ºÀ£%‹‰¡Lã#‹D‰G¸ëv¸eô[^_]ÍvU‰åWVSƒì ‹E@‰ÐÁà)Ѝ4Å¿ ä#fƒ|7(u:ƒì žàÿ4;ÿ(ã#Ç;ÿÿÿÿ‹†$ä#ƒÄ‹…€ã#ÿuPÿRD¸ƒÄ븍eô[^_]ÍvU‰åƒì‹M¸À£%ÇDÈÇȍI‰ÐÁà)ÐÁàǀç#ÿÿÿÿ‹€$ä#‹…€ã#QPÿRDè­ÖÿÿƒÄÉÃU‰åƒì ‹E‰EøUøÇBEðPRèTüÿÿ‹EðƒÄÉÃU‰åWVSƒì} ‹uEðPh”5#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº; _#~hƒìWVh`–#蜃Äj
+VèK›ƒÄ»…À•ÃœúX‰Æƒìh`–#‹Eðÿ4…$_#h™5#è]™ƒÄ…Ûuƒì h<6#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh”5#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº; _#~JƒìVSh`–#èB›ƒÄj
+S臚ƒÄœúX‰Ãƒìh`–#‹Eôÿ4…$_#h™5#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5`š#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5`š#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuh¡5#è™Ùÿÿ‰ƒÄ ƒøÿt ƒì PèJÎÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5`š#èc6ƒÄÉÉöU‰åƒìÿ5`š#èc6ƒÄÉÉöU‰åƒìÿ5`š#è{5ƒÄÉÉöU‰å‹E‹U ‹M£`š#‰dš#‰ +hš#]ÐU‰åVS‹]è°‹0ƒì SèÌîÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5`š#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5`š#è3‰ÃƒÄ…Ûu#ƒìÿ5`š#èx5ƒÄ+PWÿ5hš#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5`š#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5`š#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u +ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹øæ#‰U苀üæ#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õøæ#|[‰Eäv1‰ÐÁà)ЍÅ;šøæ#u ‹Eì;‚üæ#|1‰Ï‰ÐÁà)Ћ Åxä#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åøæ#}«ƒÿÿt‰ÐÁà)ЋU‰Åxä#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Å|ä#‹E@‰ÐÁà)ЍÅP‰ˆ(ä#‰¸,ä#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л$ä#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»(ä#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åxä#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Å|ä#‹E@‰ÐÁà)ЍÅP‰ˆ(ä#‰¸,ä#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹,ä#‹°(ä#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»(ä#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»,ä#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋÅxä#‰ƒøÿt@‰ÐÁà)ÐÇÅ|ä#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õ|ä#[‰ÂÁâ)ÕP‹‰‚(ä#ǂ,ä#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Lã#@‰ÂÁâ)4Õ ä#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ€œ#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì R范ċ^8‰Ø÷Ћ +€œ#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ÅHä#u +¸éӍvú‰ÈÁàö€ˆš#uƒ¸€š#uû魉öv‰ÐÁà)ЍÅ\ä#ƒùvèÍ©Çë
+¸Óà »ëC;H_#}ƒìÝÿ°D#Vÿ@#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»Hä#u&ƒìh„œ#VèÔüÿÿ‹ƒ$ä#ƒÄ‹…€ã#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ€š#ü¹‹}ó¥…Òt‰ßÁçÇ€š#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ< œ#ÿtq4‰u캠œ#‹@Áà‰Eè‰ÇƒÇ‹ + ®%¸ ¨%‹U苉E䋇¤¨%©t +ƒàý‰‡¤¨%ë‰ö¾ œ#‹Uì‹2@‰ Õ ¨%‰Áƒ}äÿu»‰ + ®%ǝ œ#ÿÿÿÿƒûv +è¨Çë¸þÿÿÿˆÙÓÀ!€œ#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁ƀš#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#€œ#…Àt +‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà €œ#‹5„œ#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅ`ä#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸Hä#u\ä#ƒûv +輦Çë 8ƒìh„œ#Vèúÿÿv‰ÃÁã)ÃÁ㋃$ä#ƒÄ‹…€ã#VPÿRDÃྠä#ƒÄƒ<3ÿtƒì ÿ43ÿ(ã#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Åxä#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸Hä#„…Xä#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅ\ä#ƒûvèÃ¥Çëv 8»ëvC;H_#}0ƒìÝÿ°D#Vÿ@#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 +‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁ƀš#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#€œ#…Àt ‹UԉÐPéÃ= ®%ÿu‹MԉÈP¸ 鮉ö‹5 ®%vÁ๠¨%‹‰ ®%‹U ‰¤¨%‹U‰¨¨%‹U‰¬¨%‹Lã#‰°¨%Çÿÿÿÿ‹E Áຠœ#ƒ<ÿu‰4ë>‰ö‹M ‹ œ#‰ÁЃ<Å ¨%ÿt» ¨%
+‹Í 
+ƒ<ÃÿuîR‰4Å ¨%ƒ} vèé£Ç됸ŠM Óà €œ#‹5„œ#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅ`ä#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸Hä#u\ä#ƒ} vèS£Çëv ƒìh„œ#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃$ä#ƒÄ‹…€ã#VPÿRDÃྠä#ƒÄƒ<3ÿtƒì ÿ43ÿ(ã#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Åxä#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸Hä#„…Xä#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅ\ä#ƒ} vèV¢Çë‰ö »ëvC;H_#}0ƒìÝÿ°D#Vÿ@#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=D_#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Lã#@‰ÂÁâ)<Õ ä#èŠú¡€œ##„Hºv©u=BÑøuô¾ƒ<µ œ#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!€œ#ûév µº œ#‹[‹Å ¨%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!€œ#W<ƒþv +èÌ Çë ¸þÿÿÿ‰ñÓÀ![Á⹤¨%‹
+‹u ‰‹‚¨¨%‰F‹‚¬¨%‰FƒÂ‹
+©t ƒàý‰
+ëv[¡ ®%‰Õ ¨%‰ ®%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u +û¸ éÓ‰ö‹‰G@úèu‹Lã#R‰ÑÁá)Ñf‰Í(ä#ƒìhä#jèN\ƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QèkÊÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRHƒÄh„œ#ÿ5Lã#èæòÿÿ¡Lã#@‰ÂÁâ)ÂfÇÕHä#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày +ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Lã#h u"ÿuÜÿuØÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jèù ƒÄ¡Lã#@‰ÂÁâ)‰Õç#ÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿèßËÿÿƒì ¡Lã#@‰ÂÁâ)» ä#¿DÓPèsè”ÇG@¡Lã#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡€œ##„ûº‰ö©uáBÑøuô¾ƒ<µ œ#ÿu=‹M ‰1ÇAÇAƒþv +è@Çë¸þÿÿÿ‰ñÓÀ!€œ#ûé vƒì µƒ œ#Pèúðÿÿ‰ÇƒÄƒ» œ#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!€œ#Á⹤¨%‹
+‹] ‰‹‚¨¨%‰C‹‚¬¨%‰CƒÂ‹
+©t ƒàý‰
+ëv¡ ®%‰Õ ¨%‰= ®%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Lã#@‰ÂÁâ)4Õ ä#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Lã#R‰ÑÁá)Ñf‰Í(ä#ƒìhä#jè6XƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QèRÆÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRHƒÄh„œ#ÿ5Lã#èÍîÿÿ¡Lã#@‰ÂÁâ)» ä#fÇDÓ(ÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿèaÈÿÿ¡Lã#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=(#ÿu
+ÇEèëWMèUð¡$#;B|¡ #+Eð‰Eè¡$#+Bëv¡ #+EðH‰Eè¡$#+Eôʚ;‰Aƒì ÿ5(#ÿ(ã#ƒÄ…ÛtN]ð‹E𣠝#‹Eô£$#jh€u"ÿuôÿuðÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jè:ƒÄ‰(#ë +vÇ(#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ œ#ÿuC‰uèÇEìÇEð¡Lã#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!€œ#降 µº œ#‹[‹Å ¨%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!€œ#[Á๤¨%‹‰U苐¨¨%‰U싐¬¨%‰Uð‹°¨%‰UôP‹
+©tƒàý‰
+ë[¡ ®%‰Õ ¨%‰ ®%ƒìEèPVè
+ƒÄeø[^]ÃU‰åVSƒì¡Lã#@‰ÂÁâ)4Õ ä#‹F0©…Í +‰F0‹F8‰Ã÷Ћ€œ#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ +€œ#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+CÑøuòº‰UèÇEìÇEð¡Lã#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Lã#@‰ÂÁâ)Õ ä#‰UЉÞÁæ}؁ƀš#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìSh¬5#èw}ƒÄ÷Eàtƒì‹M ÿqhÂ5#èX}ƒÄƒì jèïÎÿÿƒÄ‹UЋB8‰EԉƍUԃûv +èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv +è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁྠä#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿ(ã#Ç3ÿÿÿÿƒÄƒìh„œ#Wèúèÿÿ‰ÂÁâ)‹Õ$ä#ƒÄë ‰ÐÁà)ÐÁàfƒ¸Hä#u!‹$ä#ƒì‹•€ã#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿ˆš#¾„š#»Œš#¹ œ#‰ö‰ÐÁàǀ€š#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ» ¨%¹¤¨%RÁàB‰ÇDƒú>~éLj®%ÿÿÿÿÇœ®%Ç ®%Ç€œ#Ç„œ#ÿÿÿÿÇ(#ÿÿÿÿº¹à#»ä#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhp"èÆÕÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu +‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Lã#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Lã#@‰ÂÁâ)¡€œ# Õ\ä#‰¸]ÉöU‰åSƒì‹E‹U ú‹Lã#‰Lã#ÇD_#jPj jèœìÿÿƒÄÇD_#‰Lã#û‹]üÉÍvU‰åS‹M‹] ¡H_#ʼnŠ@#‰šD#@£H_#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…è#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹à#‹E ‰
+‹E‰‚ä#ÆD
+ƒìjhÀu"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Lã#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁ㸠ä#DŽàÿÿÿÿL0ƒìh„œ#Vèõãÿÿ‹ƒ$ä#ƒÄ‹…€ã#VPÿRDè?³ÿÿƒÄeø[^]ÐU‰åƒìÇ(#ÿÿÿÿjjèWèÿÿè³ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿL_#‹UüRÁà¹à#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…ä#èþ¬ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ= ¥#ÿt ƒ= ®%ÿuûèƒÇ ¸ÿÿÿÿéCv¡ ¥#‰‹ ¥#Õ)п¤ž#‹DÇ0£ ¥#‹Õ)й ž#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉŨž#닍<Å)Ǎ<ý ž#ü¹ó¥‹Õ)ЍŃº ž#u#¡ ®%‰‚Èž#@Áàƒˆ´¨%‹€ ¨%£ ®%‹Õ)ÐÇÅ´ž#ÿÿÿÿ‹Õ)ЍŸž#Ç@NjÕ)ЍÅÀž#Ç@NjÕ)ÐÇÅ̞#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<ÅО#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀО#ƒÀº¤ž#ƒ<ÿtƒì ÿ4ÿ(ã#ƒÄÝ)ØÁàƒ¸ ž#uE‹Èž#R Åö´¨%u¡ ®%‰ ¨%‰ ®%Ý)؋ÅȞ#@ƒ$Å´¨%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸ ž#…‹P ‹‚¨ž#@öÅ´¨%t¸¬ž#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJ¬ž#¾¨ž#‹7@‹ ®%‰Ý ¨%£ ®%jÿ41ÿ±¤ž#jèhçÿÿ‹7@ƒ Å´¨%錐‹E´Áà+E´Á๠ž#ƒ<uwPƒ<
+tÿ°¨ž#ÿ°¬ž#ÿ4
+ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áà¨ž#Rÿ°¬ž#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸¨ž#u +ƒ¸¬ž#„ÀºÀž#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒ¸ž#‰ƒÀž#‹Aƒ¼ž#‰B…Àyÿ‹Àž#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hŒx"ÿ4ÅĞ#ÿ4ÅÀž#ÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jè+ùÿÿƒÄ‹E´Áà+E´‰Å´ž#ë‰ö‹E´Áà+E´ÇÅ´ž#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<ÅО#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Å´ž#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹Àž#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹Àž#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹¸ž#õ)ðÁà‹‰‹D‰Gõ)ðÅº¤ž#ƒ<ÿtƒì ÿ4ÿ(ã#ƒÄ‹Eƒxu
+ƒx „þº¸ž#õ)ð ŋ]‹‰
+‹C‰D
+÷E t¸Àž#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘Àž#‹Eè‹]C‰Àž#‹EìC ‰B…Àyÿ‰Àž#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhŒx"ÿ4ÅĞ#ÿ4ÅÀž#ÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jè­öÿÿƒÄõ)ð‰Å´ž#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<ÅО#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Å´ž#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹Àž#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹Àž#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹¸ž#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èÍ¿ÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt +ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<ÅО#uûè܆ǸÿÿÿÿëvÕ)ЋÅ̞#ûÉÐU‰åWVS¹»¤ž#¿ ž#¾¬ž#‰öÍ)ÈÁàÇDÿÿÿÿ¸ž#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇœ¥#ÿÿÿÿÇ ¥#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Lã#@‰ÂÁâ)¾ ä#‹DÖ0©t0©t)ƒì jèzÁÿÿ¡Lã#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Lã#@‰ÂÁâ)¹ ä#‹DÑ0Áèƒà‹U ‰¡Lã#@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Lã#@‰ÂÁâ)¹ ä#‹DÑ0Áè ƒà‹U ‰¡Lã#@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5Dã#s9v‹µàã#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5Dã#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…àã#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…àã#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…àã#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…àã#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µ€ã#ƒìÿ°ôhù5#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°$ä#……ƒÀ º ä#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè ¨ƒÄë%v·Ð¸Ó5#ú€t¸ß5#út¸ë5#P[‰ÐÁà)ÐÁàÿ°ôæ#4ä#PSh`6#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…€ã#‰Eð‹¸üƒì ‹Uð‹‚ðøPèo§‰ÆƒÄƒþÿu +¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ ÅöQä#tRQ@»,ä#ƒ<D‹ç#‰ƒìý‰Ø‹Uð‚ðPVè\¥ƒÄ‹Eð˜ðSV腦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…€ã#‰Eð‹Mƒy(…©‹=Lã#‰ÐÁà)Ѝž$ä#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„й,ä#‹D@‰D@‹„à‰„àƒÂ0¹ ä#‹
+%ÿ÷ÿÿ‹\0ã ؉
+‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»$ä#‹A‰„Ѓyt‹A‰‚lä#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰lä#‹“ô‰ç#ƒy$u‹E @‰ÐÁà)Ё ÅPä#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•€ã#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅôæ#‹—ðÂPÿu 詤酋E @‰ÐÁà)ЍÅöƒQä#t?K@¾,ä#ƒ<11º$ä#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èK¤ë*ƒì‹E @‰ÐÁà)ЋÅôæ#‹—ðÂPÿu è³£ƒÄ‹E @‰ÐÁà)ÐfÇÅHä#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã +f‰E¸‹€ã#‹€ø‰EÈÇE̍E¸jjPhœ"h6#腧ÿÿ‰ÆƒÄ ƒþÿuƒì h 6#èVËÿÿƒÄ‹<€ã#v‰ÐÁà)Ðfƒ<ÅHä#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃dä#PjèJ;fǃHä#€ƒÄ‹ƒôæ#‹—ðÂPVè䢃čeô[^_]ÐU‰åWVSƒì‹}h
+6#è¾ÊÿÿèiÁÿÿ‰EðƒÄ hPh 6#è£ÊÿÿÇ$èÏÄÿÿ‰ÃƒÄSh>6#è‡Êÿÿ‹Eð‰…€ã#ƒÄ jhJ6#Sè=efÇCÆCÇC4Œ"ÇC`Œ"ÇC (‚"ÇC$ƒ"ÇC(lŒ"ÇC,ȃ"ÇC0xŒ"ÇC4€Œ"ÇC8ŒŒ"ÇC<@…"ÇC@̌"ÇCDX"ÇCH "ÇCL¨"ÇCP@Ž"ÇCTˆŽ"ÇCX¼Ž"ÇC\ "ÇC`À"ÇCd؏"ÇChð"ÇCl"ÇCp "ÇCt8"ÇCxP"ÇC|h"ǃ€€"ǃ„˜"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè˜Ãÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPèꟃÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh<†"萾ÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹€ã#‰Eð…Éx[; +Pã#sS‹€ã#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ÅHä#u +¸éèvv‰ÐÁà)Ð9 Å$ä#t +¸&éȍv…Ûuv‰ÐÁà)Ё ÅPä#ë)ƒûuv‰ÐÁà)Ё$ÅPä#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿$ä#‹U9;t\f¸Hä#€u=ƒì‹;‹Mð‹‘ðÂPV蜞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV蹟ƒÄëv‰ÐÁà)ЋU‰Åôæ#¸eô[^_]ÍvU‰åVS‹M‹4€ã#…Éx; +Pã#s‹€ã#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Lã#@‰ÂÁâ)¸ÿÿÿÿ9 Õ$ä#uZúè!P‹Lã#R‰ÑÁá)Ñ» ä#f‰DËdžè°¨ÿÿ¡Lã#@‰ÂÁâ)ƒì ¿DÓPèçO薲ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…€ã#‹€ü]ÍvU‰å‹E‹…€ã#‹€ô]ÍvU‰åS‹]‹M …ÛxU;Pã#sM‹€ã#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ÅHä#u¸ëMI‰ÐÁà)Ð9Å$ä#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öQä#”À‹U‰‹‘ôæ#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E +9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…€ã#I‰ÐÁà)ЋÅôæ#‹“ðÂPQè;œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…€ã#v‰ÐÁà)Ðfƒ<ÅHä#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃dä#PjèR5fǃHä#€ƒÄ‹ƒôæ#‹—ðÂPVè윃čeô[^_]ÐU‰åSƒì ‹E‹M ‹…€ã#I‰ÐÁà)ÐÁàfǀHä#€‹€ôæ#‹“ðÂPQ蠜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•€ã#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃dä#Pjè‹4ÿ 7ƒÄ‹ƒôæ#‹Mð‹‘ðÂPÿu 躛fǃHä#€ƒÄë‹E @‰ÐÁà)ÐfÇÅHä#eô[^_]ÐU‰åƒì‹E‹M ‹…€ã#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅHä#hÄã#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…€ã#ƒÀDŽ€R‰ÐÁà)ÐfÇÅHä#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅHä#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVh°"ÿuìÿuèÿ$ã#‰ÃƒÄƒûÿuƒìÿ5Lã#jèAäÿÿƒÄ v‰ÈÁà)ȉÅç#eô[^_]ÐU‰åƒìÿ5Lã#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Lã#jèñãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèÙãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèÁãÿÿƒÄÉÃU‰åƒìÿ5Lã#jè©ãÿÿƒÄÉÃU‰åƒìÿ5Lã#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèyãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèaãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèIãÿÿƒÄÉÃU‰åƒìÿ5Lã#jè1ãÿÿƒÄÉÃU‰åƒìÿ5Lã#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãº$ä#‹‹4…€ã#¿ ä#fÇD(€‹„Ћ–ðÂPQè=™Ç„àÿÿÿÿ詗ÿÿƒÄeô[^_]ÉöU‰åVSƒì hÀ7#è
+Áÿÿèµ·ÿÿ‰ÆÇ$Œè/»ÿÿ‰Ã‰µ€ã#ƒÄ jhX7#Sè®[fÇCÆCÇC\’"ÇC’"ÇC œ’"ÇC$Ē"ÇC(ÇC,ܒ"ÇC0è’"ÇC4ð’"ÇC8ü’"ÇC<“"ÇC@ “"ÇCDH“"ÇCHp“"ÇCL˜“"ÇCPÀ“"ÇCTè“"ÇCX”"ÇC\8”"ÇC`d”"ÇCdŒ”"ÇCh´”"ÇClܔ"ÇCp•"ÇCt,•"ÇCxT•"ÇC||•"ǃ€¤•"ǃ„Ì•"ǃˆÿÿÿÿÇ$c7#èô¿ÿÿƒÄ jVhô•"脵ÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹€ã#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…€ã#ÿ°ˆhÅ6#èìYƒÄÉÍvU‰å‹E‹…€ã#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕHä#]ÃU‰åƒìhÔ6#èxYƒÄÿ5Lã#j è„àÿÿƒÄÉÍvU‰åƒìhÛ6#èPYƒÄÿ5Lã#j è\àÿÿƒÄÉÍvU‰åƒìhâ6#è(YƒÄÿ5Lã#j è4àÿÿƒÄÉÍvU‰åƒìhé6#èYƒÄÿ5Lã#j è àÿÿƒÄÉÍvU‰åƒìhð6#èØXƒÄÿ5Lã#j èäßÿÿƒÄÉÍvU‰åƒìh÷6#è°XƒÄÿ5Lã#j è¼ßÿÿƒÄÉÍvU‰åƒìhþ6#èˆXƒÄÿ5Lã#j è”ßÿÿƒÄÉÍvU‰åƒìh7#è`XƒÄÿ5Lã#jèlßÿÿ¸ƒÄÉÉöU‰åƒìh 7#è4XƒÄÿ5Lã#jè@ßÿÿƒÄÉÍvU‰åƒìh7#è XƒÄÿ5Lã#jèßÿÿƒÄÉÍvU‰åƒìh7#èäWƒÄÿ5Lã#jèðÞÿÿƒÄÉÍvU‰åƒìh!7#è¼WƒÄÿ5Lã#jèÈÞÿÿƒÄÉÍvU‰åƒìh(7#è”WƒÄÿ5Lã#jè ÞÿÿƒÄÉÍvU‰åƒìh/7#èlWƒÄÿ5Lã#jèxÞÿÿƒÄÉÍvU‰åƒìh67#èDWƒÄÿ5Lã#jèPÞÿÿƒÄÉÍvU‰åƒìh=7#èWƒÄÿ5Lã#jè(ÞÿÿƒÄÉÍvU‰åƒìhD7#èôVƒÄÿ5Lã#jèÞÿÿƒÄÉÍvU‰åƒìhK7#èÌVƒÄÿ5Lã#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh€–"hR7#è˜ÿÿƒÄ ‹€ã#‰Ã‰šˆƒûÿuƒì h€7#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅXä#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàºÀ¥#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…Ä¥#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹Æ#ƒúÿtqÕ)Ѝ<…w‹†Ä¥#£Æ#ƒì ÿuèV@‰$èß´ÿÿ»À¥#‰ƒÄÿuPè7U‹Eð‰‡È¥#‡Ì¥#‰$è,‘ÆDƒÄû‡Ä¥#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»À¥#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾À¥#ÿ43è}´ÿÿƒÃÆD3¡Æ#‰ƒÄ¥#‰=Æ#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…Ø¥#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Lã#R‰ÑÁá)Ñf‰Í(ä#‹Õ)Ѝ4…À¥#ƒ~ ÿu
+ƒ~…“ƒìWjÿL_#ƒÄhä#jè8)ƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë!‰ö¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì QèR—ÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRH‹ +Lã#I‰ÐÁà)л ä#fÇDÃ(ÍǂÀÁ#‹‰‚ÄÁ#ƒÄF PQèÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿèM™ÿÿ¡Lã#@‰ÂÁâ)¿DÓ‰$è…@è4£ÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿL_#¡Lã#@‰ÂÁâ)¿Õ(ä#‰$èF@èõ¢ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…Ø¥#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Lã#R‰ÑÁá)Ñf‰Í(ä#‹Õ)Ѝ4…À¥#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿL_#ƒÄhä#jèš&ƒÄUè¡ä#;Xã#|¡ä#+Tã#‰Eè¡ä#+Xã#ë¡ä#+Tã#H‰Eè¡ä#+Xã#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыLã#R‰ÐÁà)Ð) Ålä#ƒì Q趔ÿÿƒÄƒ=\ã#ÿtƒì ÿ5\ã#ÿ(ã#Ç\ã#ÿÿÿÿƒÄ‹ +Lã#I‰ÐÁà)ЋÅ$ä#ƒì‹…€ã#QPÿRH‹ +Lã#I‰ÐÁà)л ä#fÇDÃ(͋E ‰‚ÀÁ#‹‰‚ÄÁ#ƒÄF PQè'ÇLã#ÿÿÿÿÇ`ã#ÿÿÿÿ貖ÿÿ¡Lã#@‰ÂÁâ)¿DÓ‰$èê=虠ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿL_#¡Lã#@‰ÂÁâ)¿Õ(ä#‰$è§=èV ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…Ø¥#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…À¥#‹JA‰J‹Z ƒûÿtG‹ÝÀÁ#9È<)Á‰È‰BƒìB PSèʊ[‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#SRÿPDè]ŠÿÿƒÄƒìWjÿL_#ƒÄ‰ðPé¼‰öúèª<‹`ã#R‰ÑÁá)Ñf‰Í(ä#‹Õ)Ѝ…À¥#‹JA‰J‹Z ƒûÿtG‹ÝÀÁ#9È<)Á‰È‰BƒìB PSè*Š[‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#SRÿPDèå”ÿÿƒÄƒìWjÿL_#¡Lã#@‰ÂÁâ)¿Õ(ä#‰$è <躞ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…Ø¥#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…À¥#^‹^ ƒûÿts݉‹€ÀÁ#;F_¿ÀÁ#ÇEðv‹F+:‰FƒìF PSè
+‰[‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿL_#ƒÄƒ}ðtèlˆÿÿ‹Uì‰ÐPéõúèÊ:‹`ã#R‰ÑÁá)Ñf‰Í(ä#‹E‹Õ)Ѝ4…À¥#^‹^ ƒûÿtr݉‹€ÀÁ#;F^¿ÀÁ#ÇEð‰ö‹F+:‰FƒìF PSè2ˆ[‰ÐÁà)ЋÅ$ä#ƒÄ‹•€ã#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿL_#ƒÄƒ}ðt輒ÿÿ¡Lã#@‰ÂÁâ)ƒì ¿Õ(ä#Pèð9蟜ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿Ä¥#õ)óÁãǃÀ¥#‰4;ǃȥ#ƒì ƒÌ¥#PèF‡ƒÃF‰;ƃȥ#ƒÄ‰Æþÿ~±Ç¸Á#ÿÿÿÿǐÆ#ƒìjh4¥"蒥ÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…Ø¥#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)лÀ¥#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè‰ªÿÿ‹Õ)ÐÆDƒ‹Õ)ЋÆ#‰…Ô¥#‹£Æ#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…Ø¥#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…Ì¥#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…Ø¥#‹Õ)ЋÆ#‰…Ô¥#‹£Æ#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…Ø¥#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸Ì¥#ÿu ‹€È¥#‰ë7‰öÇ‹Õ)Ћ…Ì¥#¹(ä#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹Æ#‰ƒúÿtnÕ)Ћ…Ô¥#£Æ#‹Õ)лÀ¥#ǃ‹Õ)Љ …È¥#ƒì ‹Õ)Ѝ…Ì¥#P腄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…Ø¥#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…À¥#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<ÕHä#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾Hä#uAƒì‹ÝÄÁ#Õ)Ѝ…Ì¥#PS脃‹†$ä#ƒÄ‹…€ã#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=X_#…ÚÇX_#¹»À®%¾Ä®%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh Æ#èÜýÿÿ¹ƒÄ¾$±%» ±%‰ö‰ÁàQ‰0Ɖуù +véÇT³%ÿÿÿÿÆP³%DZ%¹¾„³%»€³%vÍ)ÈÁàQ‰0ƉуùvãÇ°¶%ÿÿÿÿƬ¶%Çȶ%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=±%ÿuèí^ǍûÇEìÿÿÿÿ됡±%€‹Õ$±%‰±%û‰Eìƒ}ìÿu +¸ÿÿÿÿéìvƒì h Æ#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Åà®%t0ƒìÿu¿ōƒÀ®%Pè³EƒÄ…Àu€»Ø®%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃà®%ƒìÿuƒÀ®%Pè÷D‹E쉃Ԯ%ƒÄ€}óu‰Â’‹] f‰Å(±%ëv‹E썀‹E ¯Ef‰Õ(±%úƒì ‹U썒Áã·ƒ(±%Pè5¤ÿÿº,±%‰ƒÄû…Àu%è”]ǒƒì h Æ#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uྠ±%‹ƒ,±%‰‚$±%‰2ƒìjjƒ<±%Pè:ûÿÿƒÄ ·D3Pjƒ@±%Pè#ûÿÿƒÄ jjÃD±%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=ȶ%ÿuèø\ǎûÇEèÿÿÿÿë¡È¶%Å)‹•„³%‰ȶ%û‰Eèƒ}èÿu_ƒì h Æ#èvôÿÿ‹Eèéä‰öè§\ǐƒì h Æ#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h Æ#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁเ³%ŠUòˆT P‹]ì‰
+‹] f‰\
+ǀ„³%ÿÿÿÿ‰ºˆ³%‹]썛ÆÕ ±%ƍ¿ōr¿À®%€|>t%ƒì¶D>PšÜ®%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h Æ#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=ȶ%ÿuèa[ǎûÇEìÿÿÿÿë ¡È¶%Å)‹•„³%‰ȶ%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁ຀³%ˆ\ ‹M f‰Lǀ„³%ÿÿÿÿƒì h Æ#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Åà®%u ¿ÆEçë8ƒìÿu¶ÅÀ®%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Áã¸À®%ÆD ÆDƒìÿuPè>AƒÄ jjÃÜ®%Sè/øÿÿÇ$ Æ#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCºÀ®%€|t'þDƒì h Æ#è®ñÿÿƒÄ jjƒÜ®%Pèûîÿÿ됃ì h Æ#è‹ñÿÿƒÄ¶‹<ÅÔ®%¿ŠUó:Å8±%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·Å(±%9E u€}ót(¿·Å(±%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h Æ#è ìÿÿ¶‹Åä®%ƒÄƒúÿ„­€}óu#è&YǕƒì h Æ#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…”³%9E t"èíXǔƒì h Æ#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »Ä®%‹‰„³%‹Mì‰ ë/‰öèŸXǑƒì h Æ#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰Åä®%ƒì h Æ#è*ðÿÿ‹EìÁà+EìÁàH‰±ˆ³%º€³%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗€³%‰Uðh Æ#èÏêÿÿ‹Mð‹Y›ÁãC‰EèºÄ®%‹€Áà° ±%ƀ ±%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv 谞ÿÿû¹Ä®%‹Eè‹ú ’¡±%‰Í$±%‰±%ûƇ€³%ƒÃ ‹Uð‹B‰ƒÄ®%ú¡È¶%‰‡„³%‹Mì‰ +ȶ%ûƃÀ®%Ç$ Æ#è
+ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…€³%‰Eð‹@€Å ±%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…€³%‰Eð‹@€Å ±%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìhß7#è;ƒÄÿ5±%hë7#è;»ƒÄÝ)ØÁà€¸€³%t8€³%‹B€Å ±%ƒì ÿp ÿp$‹B€ÅÀ®%PShÿ7#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…³%’Å ±%ÿp ÿp$RQh 8#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h Æ#èHæÿÿ¿ÓÕ)Ѝ …‹˜³%€Å ƒÄ€ºÀ®%u ‹„³%‰‚Ä®%¿ÃÅ)ÂÁâƂ€³%ú‹ +ȶ%‰Š„³%£È¶%ûƒì h Æ#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…àã#ú‹^…Ûu-ƒì j èl™ÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Lã#u û¸#é~ƒ;ÿtc¾ ä#‰ö‹ +Lã#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Lã#‰CÿCèh€ÿÿ¡Lã#@‰ÂÁâ)ƒì ¿DÖPèŸ'èNŠÿÿƒÄûúƒ;ÿu¤¡Lã#ÿD‡D¡Lã#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Lã#tû¸髍vúè*'‹Lã# [‰ÊÁâ)Êf‰Õ(ä#‹E‹…àã#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅpä#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGènÿÿ¡Lã#@‰ÂÁâ)ƒì ¿Õ(ä#Pè¢&èQ‰ÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h„8#è~ÿÿèe”ÿÿ‰ÆÇ$裗ÿÿ‰Ã‰µàã#ƒÄ jh˜8#Sè"8fÇCÍÆCÇCÇCtµ"ÇC Àµ"ÇC$̵"ÇC(Ôµ"ÇC,¶"ÇC00¶"ÇC4x¶"ÇC8ز"ÇC<À¶"ÇC@À³"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…àã#ƒì h`8#è7¾ƒÄƒÃƒìÿt³@h8#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…àã#ƒÀƒ|@tƒìRj
+èȽÿÿƒÄÉÍvU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j è+–ÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsè<–ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j 苕ÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+û¸ë"‰ö¡Lã#‹½àã#ƒÂÿD‚@¡Lã#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•àã#ú‹p¸…ö„V‹;Lã#u û¸#éA‹Lã#‹F ¿ ä#;„“°v +¸é v¡Lã#‹Œƒ°‹“¬…Òt‰ö‹;Lã#…Š‹R…Òu븅À…†‹ +Lã#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Lã#‰B‹ƒ¬ÿ@èÂ{ÿÿ¡Lã#@‰ÂÁâ)ƒì ¿D×Pèù"訅ÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…àã#¡Lã#ÿDƒD¡Lã#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½àã#ú‹X¸…Û„Ù‹;Lã#uû¸#éčv‹Lã#‹C ;„‘°s
+¸饡Lã#‹´°‹‘¬…Òt‰ö‹;Lã#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½àã#¡Lã#ÿDD¡Lã#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Lã#tû¸éڍvúè&!‹Lã# [‰ÊÁâ)Êf‰Õ(ä#‹E‹…àã#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅpä#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu +‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bè;yÿÿ¡Lã#@‰ÂÁâ)ƒì ¿Õ(ä#Pèo èƒÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hÄ8#èJ—ÿÿè1Žÿÿ‰ÃÇ$€èo‘ÿÿ‰Æ‰4àã#ƒÄ jhØ8#Vèî1fÇFÌÆFÇFÇF|¼"ÇF ½"ÇF$,½"ÇF(\½"ÇF,¤½"ÇF0н"ÇF4(¾"ÇF88·"ÇF<À¸"ÇF@Ĺ"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…àã#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…àã#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…àã#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…àã#h`8#è0»ƒÄwƒìÿtž@h8#èó/ƒÄCû™~ãƒì h¢8#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h¾8#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …àã#Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹…àã#ƒ|³DtƒìVj
+èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j苎ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿs茎ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Shâ8#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿€Ã%ÿt8CP‰Eä·8Phé8#èá-ƒÄ ÿt;·D;Ph÷8#èÊ-ƒÄ ÿt; s·>Ph9#è±-ƒÄ ÿt>·D>Ph9#èš-ƒÄ ‹Uä·D:P·DLPh*9#è~-‹UèÕƒÄ·ØSh;9#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh€9#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º`F&fƒ=`F&yA¿Áfƒ<Byfù™~îfù™~ƒì hP9#èÎ,¸ƒÄé ¿Á<¹`F&‰Úf Ê€f‰Ǎ<ÿÁ纀Ã%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇìÃ%¾ G&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁเÃ%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ`F&]ÉöU‰åSƒì‹]¿E Phh9#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhhÈ"SèƒÄhôÁ"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹\_#€82uºð°îƒìShÂ:#èˆ*ƒÄÁ㋃\_#@PhE#èp*ƒÄÿ³ _#ènƒÄ‹]üÉÉöU‰åƒìÿuhÙ:#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=ÄÁ%„à…ÿ„Ø¡@¸%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡D¸%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡D¸%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡@¸%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+¡D¸%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡D¸%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=4¸%…Ρ8¸%€€€€€€‰ÃÁã‹ +<¸%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡8¸%‰¡<¸%éqvƒø…ç¶$¸%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +0¸%f)Ù·É +@¸%º×®¬]‰È÷êÁú‰ÈÁø)ÂD¸%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£@¸%f‰0¸%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡D¸%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡D¸%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹@¸%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+‰ð™‰È)Ћ +D¸%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=4¸%…rUè¡8¸%‰¡<¸%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð·ÀÁ%9Æv%hæ:#j_hø:#hÿ:#èm%Ç$èmƒÄ·ÀÁ%)ó¯(¸%·ÀÁ%‰Ø‰Ñº÷ñ‰Ãº °
+îì©t‹ +(¸%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡8¸%€€€€€€Áà‰Eä‹ +<¸%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ`#ƒ=`#uƒ=ä_#tÿä_#¶E÷€Áàºì¶%ƒ<uIÇö€ð¶%tûƒì ¶]÷›Áã¾à¶%ÿ43ÿ“ä¶%ƒÄöDtú¶E÷€Ç…ì¶%ÿì_#ƒ=`#uƒ=è_#tÿè_#ÿ +`#eø[^]ÍvU‰åWVSº¿ì¶%¾è¶%»ä¶%¹à¶%’ÁàÇ8‰0ÇÇBƒú~ÜÇ`#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…ì¶%t÷Æu¸ÿÿÿÿëH’ …ǁì¶%û…Ût‰™ä¶%ºà¶%è¶%‰‰t
+됍’Ç…ì¶%¸[^]ÐU‰å¡`#]ÉöU‰åSƒì¶$¸%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +0¸%f)Ù·É +@¸%º×®¬]‰È÷êÁú‰ÈÁø)ÂD¸%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ +@¸%f‰0¸%ÿ`#ƒ=`#uƒ=ä_#tÿä_#¡<¸%‰Ã¤Æ#º¡/¸D‰Ø÷êÁú‰ÙÁù)Ê8¸%’’’’’’’’’Á⠉Ø)У<¸%‹ ¸%ë$‹¡,¸%‰‰,¸%‰ ¸%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;8¸%;8¸%uƋB;<¸%~»ƒ=`#uƒ=è_#tÿè_#ÿ +`#‹]üÉÃU‰åWVSƒì‹uhÄÖ"j@èØ +ƒÄƒ>t,ƒì h;#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì h5;#è³ ‹N‰ +(¸%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ +ÀÁ%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£4¸%ƒ=$H&~»A¹C°p‰ÊÚîîÆ$¸%ë%Æ$¸%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾`¸%»d¸%ƒùbIÁàx¸%‰0I‰LÃAƒùc~ßǨÁ%Ç,¸%`¸%Çä_#Çè_#¡(¸%€€€ÁࣤÆ#Ç<¸%Ç8¸%Ç@¸%ÇD¸%fÇ0¸%ƒ=4¸%uÇ$ã#´Í"Ç(ã#LÎ"ëÇ$ã#œÎ"Ç(ã#(Õ"eô[^_]ÃU‰å‹E£ä_#]ÍvU‰å‹E£è_#]ÍvU‰å‹E£ô_#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=,¸%tl‹ +,¸%‹£,¸%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹ ¸%}è‹uè됋…Òt‰ð;B  +;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ + ¸%‰‹AƒÄ [^_]ÐU‰å‹E¹‹ ¸%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+‹£ ¸%됋‰¡,¸%‰‰,¸%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=,¸%„q‹5,¸%‹£,¸%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹ ¸%}è‹Mè됋…Ût‰È;C  +;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5 ¸%ƒ=ÄÁ%…ôƒìEàPjè3óÿÿ‹ ¸%ƒÄ‹Eà;B  +;B u‹Eä;B~ÇEÜÇEØëK}؋ ¸%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡ ¸%‹@ +EàH‰EØ¡ ¸%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶$¸%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹0¸%f)Ú·Ò‰Ö5@¸%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +D¸%‰AÁà)ȍÁ‰ÁÁá ȉò)‰@¸%f‰0¸%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡D¸%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡D¸%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ= ¸%„/ÇÄÁ%‹ ¸%‹Eè;B ;B …Œ‹C;BŽ€ƒ=`#uƒ=ä_#tÿä_#ÿ`#‹ ¸%ë#‹¡,¸%‰‰,¸%‰ ¸%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè +;EèűB;Eì~ă=`#uƒ=è_#tÿè_#ÿ +`#¶$¸%ƒøt"ƒø …Àt +ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹0¸%f)Ú·Ò‰Ö5@¸%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +D¸%‰AÁà)ȍÁ‰ÁÁá ȉò)‰@¸%f‰0¸%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡D¸%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡D¸%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹ ¸%‹Mè;J 
+;J u;B~ÇEäÇEàëJ]à‹ ¸%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡ ¸%‹@ +EèH‰Eà¡ ¸%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇÄÁ%ë +‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹ ¸%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£ ¸%»ë‹‰¡,¸%‰‰,¸%ƒ=ÄÁ%…ƒ= ¸%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹ ¸%ƒÄ‹Eð;B  +;B u‹Eô;B~ÇEìÇEèëJ]è‹ ¸%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡ ¸%‹@ +EðH‰Eè¡ ¸%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼¨Ö#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡ð_#@£ð_#1ÛfŒÓü¡4¸%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡ø_#f9þ_#t f£þ_#ÿ-ú_#ƒ=ô_#t‹ô_#ÿÓf©f¡ffaωöU‰å‹EØf£þ_#f£ø_#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;þ_#t f£þ_#ÿ-ú_#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡¸]#]ÉöU‰å]ÍvU‰åSƒì‹¸]#誃ì SèÍ^ÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=ª]#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèª]#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹À`#fÇD
+8ƂÅ`#îƂÄ`#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+`#ë7fƒùw<·Éƒé¸Óà
+`#¢`#º¡î<ÿu `#©uƒÈ¢`#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"`#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"`#¢`#º¡î `#©t%û¢`#º!î]ÉöU‰å¿ø_#]ÃU‰åƒì‹Ef£ø_#˜PèWüÿÿƒÄÉÐU‰å¿ø_#]ÃU‰åƒì‹E‰Âf£ø_#ƒ=`#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹`#ºP`#‰öµÇäÞ"ÇäÞ"Fƒþ~åƒì EÈPèÅèºÇ H&;#‹EÈ£$H&¶ `#£(H&ƒÄ‹EУ0H&‹EÔ£4H&‹EØ£8H&hà"jè£ýÿÿƒÄh—à"jè”ýÿÿƒÄh¡à"jè…ýÿÿƒÄh¨à"jèvýÿÿƒÄh¯à"jègýÿÿƒÄh¶à"jèXýÿÿƒÄh½à"jèIýÿÿƒÄhá"jè:ýÿÿƒÄhÄà"jè+ýÿÿƒÄhËà"j èýÿÿƒÄhÒà"j
+è +ýÿÿƒÄhÙà"j èþüÿÿƒÄhàà"j èïüÿÿƒÄhçà"j +èàüÿÿƒÄhîà"jèÑüÿÿƒÄhõà"jèÂüÿÿƒÄhüà"jè³üÿÿƒÄh¼ß"jAè¤üÿÿƒÄhÄß"jBè•üÿÿƒÄhÌß"jCè†üÿÿƒÄhÔß"jDèwüÿÿƒÄhÜß"jEèhüÿÿƒÄhäß"jFèYüÿÿƒÄhìß"jGèJüÿÿƒÄhôß"jpè;üÿÿƒÄhüß"jqè,üÿÿƒÄhà"jrèüÿÿƒÄh à"jsèüÿÿƒÄhà"jtèÿûÿÿƒÄhà"juèðûÿÿƒÄh$à"jvèáûÿÿƒÄh,à"jwèÒûÿÿf +”G&€¾ƒÄvÀŀÃ%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿ G&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=$H&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•P`#]ÉöU‰å‹U‹E ‰•`#]ÉöU‰åƒìh`;#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃÆ `#Ûã¹âþfÇ`#ZZÝ=`#¹âþf¡`#<u+Ù=`#¹âþf¡`#f%?fƒø?uÆ `#Æ `#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë(`¸ ë `¸ ë`¸ +ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…`#ÿÓ[° ƒûrº îº îf¡ø_#f;þ_#t f£þ_#ÿ-ú_#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ëI¸ ëB¸ ë;¸ +ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=ª]#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…P`#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿`#È·À-yƒÀÁø9ÂtU¿`#@ÀÝ4ÅìÃ%›È·À-yƒÀÁøf£`#¿5`#¿`H&4v4ö4õìÃ%¹üó¥Ý%`H&^_]ÉöU‰å¿`#]ÃU‰åWVSƒì(ŠM¡”`#Áà ˜€ f¶ÎH&f£ªÖ#f¶ÍH&f£¬Ö#€ù t%€ù €ù„óé‰ö€ù
+„#é‰öfƒªÖ#·ªÖ#;ÐH&Œ½fǪÖ#·¬Ö#¡ÔH&H9Â…¿¡ÐH&H‰Eì‰Uèf¾ÌH&Áâf‰Uò¡”`#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯ÐH&È·F‰Ø¯ÐH&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯ÐH&Èf‹]òf‰FA;Mì~çé)‰öfǨÖ#·ªÖ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰¨Ö#f¡¨Ö#f£ªÖ#éævfǪÖ#·¬Ö#¡ÔH&H9Â…¾¡ÐH&H‰Eà‰UÜf¾ÌH&Áâf‰U桔`#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯ÐH&È·F‰Ø¯ÐH&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯ÐH&Èf‹]æf‰FA;Mà~çé%‰öfÿ +ªÖ#·ªÖ#·¬Ö#¯ÐH&ÂÆS fÿªÖ#éõ‰ö·ªÖ#·¬Ö#¯ÐH&Ј CfÿªÖ#·ªÖ#;ÐH&Ž¿fǪÖ#·¬Ö#¡ÔH&H9Â…š¡ÐH&H‰EԉUÐf¾ÌH&Áâf‰UÚ¡”`#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯ÐH&È·F‰Ø¯ÐH&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯ÐH&Èf‹]Úf‰FA;MÔ~çëfÿ¬Ö#·5ªÖ#·=¬Ö#‰øf¯ÐH&f‰EΡ”`#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆÎH&‰ø¢ÍH&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯ÐH&f‰Eò¡”`#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢ÎH&‰úˆÍH&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡”`#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯ÐH&È·G‰ð¯ÐH&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯ÐH&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡ÐH&H‰Eð‹ÔH&K‰]ìf¾ÌH&Áàf‰Eꡔ`#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯ÐH&È·F‰Ø¯ÐH&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯ÐH&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰ÐH&¶„@£ÔH&¶„ÿ ¢ÌH&¶P¢ÎH&¶Q¢ÍH&¶`¢¯Ö#¶a¢®Ö#ǘ`#Ç”`#]ÃU‰åWVSƒì ÎH&¢P ÍH&¢Q¶ÀP¶ÎH&PèŠýÿÿ¶®Ö#¶5¯Ö#ƒÄ¹Ô°
+‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £˜`#¹Ô° +‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹”`#Áâ»ÀÖ#¶ÎH&‰¹àÖ#¶ÍH&‰
+µŠ¢ÎH&Š
+¢ÍH&‰5”`#[^]ÃU‰å¡˜`#]ÉöU‰å¡”`#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯ÐH&¡”`#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢ÍH&ŠE¢ÎH&ƒÄeô[^_]ÍvU‰åWVSƒì ¡ÐH&H‰Eð‹=ÔH&Of¾ÌH&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯ÐH&¡”`#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆÍH&ÆÎH&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯ÐH&¡”`#Áà ÂU”€ ˆ
+ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯ÐH&¡”`#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯ÐH&¡”`#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìhœ;#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh×#èX‰ÃÇ$×#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE PÿuhÙ#謉ÃÇ$Ù#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë +¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…à+#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë +vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäj
+VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} +ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…0-#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$…€.#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìh¨;#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhµ;#Wè¶öÿÿ‰ÇƒÄ EìPj
+됃ìhÀ;#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä +ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhØ;#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} +‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèõÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(ÝÀ/#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/ÝÀ/#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝÀ/#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4ÝÀ/#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}ÝÀ/#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E œ`#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝÈ/#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝø;#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝø;#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5Ð/#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ<#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿÜ<#Ü +Ð/#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝØ/#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ýø;#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝø;#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf +? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh<#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh<#Qè çÿÿƒÄ¸ë‰ö…Étƒìh<#QèçÿÿƒÄ¸ÉÃU‰åƒì¸Û#ƒ=¨`#tÿ¨`#ÉÃU‰å‹E£¨`#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èvÝ]èƒÄƒ=¬`#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè8ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•ð/#ÝØÇEغ<#ƒøc~º#<#‰UÜÇEðÇEôƒ=¬`#„}ƒì EØP誃ąÀ…uƒ=¬`#…Yƒìjh)<#éëvÝØÇEغ=<#ƒøc~ºB<#‰UÜÇEðÇEôƒ=¬`#„ƒì EØPè>ƒÄ…À… ƒ=¬`#…íƒìjhH<#év‰]à‰uäÝ]èÇEغ\<#ƒøc~ºb<#‰UÜÇEðÇEôƒ=¬`#„žƒì EØPè˃ąÀ…–ƒ=¬`#…zƒìjhi<#é ÝØÇEغ~<#ƒøc~º„<#‰U܃=¬`#uÇEðàÇEôÿÿïGé¸ +¡ `#‹¤`#‰Eð‰Uôé¡ +‰öÝØÇEغ>#ƒøc~º>#‰U܃=¬`#uÇEðàÇEôÿÿïGéh +¡ `#‹¤`#‰Eð‰UôéQ +‰öÝØÇEغ‹<#ƒøc~º<#‰U܃=¬`#uÇEðàÇEôÿÿïGé +¡ `#‹¤`#‰Eð‰Uôé +‰öÝØÇEغ‹<#ƒøc~º<#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ7#ƒøc~º”<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„óƒì EØPè ƒÄ…À…ëƒ=¬`#…σìjh˜<#éaÝØÇEغ7#ƒøc~º”<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„gƒì EØP蔃ąÀ…_ƒ=¬`#…Cƒìjh˜<#éÕ +ÝØÇEغØ6#ƒøc~ºª<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„Û +ƒì EØPèƒÄ…À…Ó +ƒ=¬`#…· +ƒìjh®<#éI +ÝØÇEغØ6#ƒøc~ºª<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„O +ƒì EØPè| +ƒÄ…À…G +ƒ=¬`#…+ +ƒìjh®<#é½ ÝØÇEغÀ<#ƒøc~ºÃ<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„à ƒì EØPèð ƒÄ…À…» ƒ=¬`#…Ÿ ƒìjhÇ<#é1 ÝØÇEغÀ<#ƒøc~ºÃ<#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„7 ƒì EØPèd ƒÄ…À…/ ƒ=¬`#… ƒìjhÇ<#é¥ ÝØÇEغÙ<#ƒøc~ºà<#‰U܃=¬`#uÇEðàÇEôÿÿïGéP ¡ `#‹¤`#‰Eð‰Uôé9 ‰öÝØÇEغÙ<#ƒøc~ºà<#‰U܃=¬`#uÇEðàÇEôÿÿïGë¡ `#‹¤`#‰Eð‰Uôƒ=¬`#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=¬`#…= ƒìjhè<#éÏ
+vÝØÇEغü<#ƒøc~º=#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=¬`#…¯
+ƒìjh=#éA
+ÝØÇEغü<#ƒøc~º=#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=¬`#…#
+ƒìjh=#éµ ÝØÇEغ)=#ƒøc~º/=#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„Íƒì EØPèè ƒÄ…À…³ ƒ=¬`#…— ƒìjh6=#é) ÝØÇEغ)=#ƒøc~º/=#‰U܃=¬`#uÇEðàÇEôÿÿïÇë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„/ ƒì EØPè\ ƒÄ…À…' ƒ=¬`#… ƒìjhI=#靐ÝØÇEغ^=#ƒøc~ºb=#‰UÜÇEðÇEôƒ=¬`#… ƒì EØPèòƒÄ…À…½ƒìjhg=#jèÚõÿÿèaõÿÿÇ!ƒÄ降vÇEغ^=#ƒøc~ºb=#‰U܃=¬`#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ +È>#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡ `#‹¤`#‰Eð‰Uô‰]ЉuÔÝEÐÜ +È>#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡ `#‹¤`#ò€‰Eð‰UôéòvÝØÇEغ^=#ƒøc~ºb=#‰UÜÇEðÇEôéÁ‰öÝØÇEغ^=#ƒøc~ºb=#‰U܃=¬`#uÇEðÇEôë¡ `#‹¤`#ò€‰Eð‰Uôƒ=¬`#„ãƒì EØPèƒÄ…À…Ûƒ=¬`#…¿ƒìjh=#éQÝØÇEغ^=#ƒøc~ºb=#‰U܃=¬`#uÇEðÇEôëÇEðÇEôøƒ=¬`#„`ƒì EØP荃ąÀ…Xƒ=¬`#…<ƒìj h >#éΉöÇEغ™=#ƒøc~ºž=#‰U܃=¬`#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ + `#‹¤`#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغ¤=#ƒøc~º©=#‰U܃=¬`#uÇEðÇEôëÇEðÇEôøƒ=¬`#„Lƒì EØPèyƒÄ…À…Dƒ=¬`#…(ƒìjh¯=#麉öÇEغÃ=#ƒøc~ºÈ=#‰U܃=¬`#uÝ]ðëÝØÇEðÇEôøƒ=¬`#„Òƒì EØPèÿƒÄ…À…ʃ=¬`#…®ƒìjhÎ=#é@ÝØÇEغã=#ƒøc~ºí=#‰UÜÇEðÇEôøƒ=¬`#„iƒì EØP薃ąÀ…aƒ=¬`#…Eƒìjhø=#é׍vÝØÇEغ>#ƒøc~º>#‰UÜÇEðÇEôøƒ=¬`#„ýƒì EØPè*ƒÄ…À…õƒ=¬`#…Ùƒìjh>#ékvÝØÇEغ3>#ƒøc~º9>#‰UÜÇEðÇEôøƒ=¬`#„‘ƒì EØP较ąÀ…‰ƒ=¬`#…mƒìjh@>#éÿvÇEغ3>#ƒøc~º9>#‰UÜÜ5Ð>#Ý]ðƒ=¬`#„,ƒì EØPèYƒÄ…À…$ƒ=¬`#…ƒìjhU>#隉öÇEغh>#ƒøc~ºn>#‰U܋ + `#‹¤`#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغh>#ƒøc~ºn>#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=¬`#…jé|vÝØÇEغu>#ƒøcŽ•ºx>#鋍vÝØÇEغ7#ƒøc~uº”<#ën‰öÝØÇEغ‹>#ƒøc~YºŽ>#ëR‰öÝØÇEغØ6#ƒøc~=ºª<#ë6‰öÝØÇEغ’>#ƒøc~!º•>#ë‰öÝØÇEغÀ<#ƒøc~ºÃ<#‰UÜÇEðÇEôƒ=¬`#„¯ƒì EØPèʃąÀ…•ƒ=¬`#…‹ƒìjÿuÜjè§îÿÿƒÄ jh|>#jè–îÿÿƒÄëfÝØÇEغÚ<#ƒøc~ºá<#‰U܃=¬`#uÇEðàÇEôÿÿïGë¡ `#‹¤`#‰Eð‰Uôƒ=¬`#tƒì EØPè2ƒÄ…À…ýè²íÿÿÇ"éívÝØÇEغÚ<#ƒøc~ºá<#‰U܃=¬`#uÇEðàÇEôÿÿïGë¡ `#‹¤`#‰Eð‰Uôƒ=¬`#„‰ƒì EØP趃Ä…À…ƒ=¬`#uiƒìjhé<#jè•íÿÿƒÄëSÇEغ^=#ƒøc~ºb=#‰UÜÝ]ðƒ=¬`#ÿt ƒ=¬`#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÄìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhØ>#hâ>#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hØ>#hí>#è` ƒÄöCtƒìjahØ>#h ?#èC ƒÄöC tƒìjbhØ>#h`?#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhØ>#h?#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh?#h›?#èX ƒÄ‹F ;Cv‹F;C sƒìjmh?#hÀ?#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLhí?#hõ?#èÙ
+ƒÄ…ÿuƒìjMhí?#hþ?#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUhí?#h@@#è€
+ƒÄƒ~t‹F;F rƒìjUhí?#h @#è[
+ƒÄ‹F +F9FvƒìjUhí?#hà@#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^hí?#h A#èø ƒÄöCtƒìj_hí?#h`A#èÛ ƒÄƒ;t9wƒìj`hí?#h A#è» ƒÄ;^ rƒìjahí?#h@#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwhí?#h-@#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThÉA#hõ?#èۃă} uƒìjUhÉA#hþ?#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hÉA#h@@#舃ăt‹G;G rƒìj[hÉA#h @#ècƒÄ‹G +G9Gvƒìj[hÉA#hà@#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷ÃtƒìjkhÉA#h A#èèƒÄöCtƒìjlhÉA#h`A#è˃ă;t9wƒìjmhÉA#h A#諃Ä;_ rƒìjnhÉA#h@#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hÉA#hÔA#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hÉA#hB#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´hÉA#h-@#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]Sh2B#èaÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvhÀB#è1ÌÿÿƒÄ ƒ~uƒ~t‹F;FsƒìjahDB#h@@#袃ă~t‹F;F rƒìjahDB#h @#è}ƒÄ‹F +F9FvƒìjahDB#hà@#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPShC#è“ËÿÿƒÄ ÷ÃtƒìjihDB#h A#èƒÄöCtƒìjjhDB#h@C#èóƒÄƒ{wƒìjkhDB#hKB#èփă;t9wƒìjlhDB#h A#趃Ä;^ rƒìjmhDB#h@#蚃Ä{‹…Û…BÿÿÿƒìWhgB#èàÊÿÿƒÄ9~tƒìjshDB#hzB#è`ƒÄ‹6…ö…cþÿÿƒì h’B#èªÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNhÛ>#hõ?#è ƒÄ…ÛuƒìjOhÛ>#hrC#èñƒÄƒ}uƒìjPhÛ>#hþ?#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXhÛ>#h}C#螃ă{uƒ{t‹C;CsƒìjYhÛ>#h@@#èsƒÄƒ{t‹C;C rƒìjYhÛ>#h @#èNƒÄ‹C +C9CvƒìjYhÛ>#hà@#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9CvƒìjbhÛ>#hà@#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnhÛ>#h C#諃ąöt8‹U:9ðr.9ðtƒìjuhÛ>#hàC#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]hD#h@@#蠃ă~t‹F;F rƒìj]hD#h @#è{ƒÄ‹F +F9Fvƒìj]hD#hà@#èYƒÄÿEð¿‹^…Û„¨v÷ÃtƒìjdhD#h A#è$ƒÄöCtƒìjehD#h@C#èƒÄƒ{wƒìjfhD#hKB#èêƒÄƒ;t9wƒìjghD#h A#èʃÄ;^ rƒìjhhD#h@#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnhD#hzB#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh D#èºÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh Û#èÈÿÿƒÄh Û#ÿ5`ã#jSVh D#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Lã#jÿuÿu ÿuh`D#èƒÄ ÉÉöU‰åƒì E Pÿuh ß#èÈÿÿƒÄ jjh¸&#è@!ÿÿƒÄh ß#hE#è†ÅÿÿÇ$MèšÿÿƒÄÉÐU‰åƒìh ß#hàD#è_ÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л$ä#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»(ä#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åxä#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Å|ä#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ(ä#‰¸,ä#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹øæ#‰U苀üæ#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õøæ#|[‰Eäv1‰ÐÁà)ЍÅ;šøæ#u ‹Eì;‚üæ#|1‰Ï‰ÐÁà)Ћ Åxä#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åøæ#}«ƒÿÿt‰ÐÁà)ЋU‰Åxä#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Å|ä#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ(ä#‰¸,ä#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜,ä#¿(ä#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»,ä#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õxä#‰ƒøÿt@‰ÐÁà)ÐÇÅ|ä#ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Åxä#‹@‰ÂÁâ)‰ Õ|ä#됉KI‰ÐÁà)ÐÇÅxä#ÿÿÿÿI‰ÐÁà)ÐÇÅ|ä#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰Å|ä#‹C@‰ÂÁâ)‰ Õxä#ë‰ö‰ I‰ÐÁà)ÐÇÅ|ä#ÿÿÿÿI‰ÐÁà)ÐÇÅxä#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸!E#됸&E#됸*E#됸0E#됸ñ5#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèH—ÿÿƒÄ ÿuìÿuèh@E#èaÁÿÿƒÄ÷EtN¾;5Pã#sA¿€ã#vƒì µ‹;¶BP·BPRVh€E#èÁÿÿƒÄ‹;VÿP ƒÄF;5Pã#rÇ÷Etƒì h[E#èñÀÿÿè¬!ÿÿƒÄ‹Uä‰ÐPeô[^_]Éödï",ò",ò",ò",ò",ò"˜ñ",ò"¤ñ"°ñ",ò"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ"¼ñ",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò",ò"pï"„ï"ðð"°ð"0ñ"Œñ"„ï",ò",ò"€ñ",ò"Œñ",ò"hð",ò",ò"ˆð",ò"Ðï",ò",ò"ð"ó"ðô"ðô"ðô"ðô"ðô"hô"ðô"tô"|ô"ðô"Œô"Œô"Œô"Œô"Œô"Œô"Œô"Œô"Œô"Œô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ðô"ó"0ó"ðô"ðô"ðô"\ô"0ó"ðô"ðô"Pô"ðô"\ô"ðô"ðô"ðô"ðô"(ô"ðô"€ó"ðô"ðô"Äó"ü÷"ø"ø"ø"ø"ø"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"Ìõ"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"ø"üõ"€ö"|÷"|÷"|÷"ð÷"€ö"ø"ø"ä÷"ø"ð÷"ø"ø"ø"ø"ö"ø"ðö"ø"ø" ÷"$@$@d#Ð#<#¬#ü#L #œ #Ì #X
+#ä
+#p #ü #ˆ # +#d +#ì +#x#####¬#Ü#h#ì#|##x#ä#P#¼# #l#°#Ô#ð# #(#D#Ä#<#Ä#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#d#Ð#<#¬#ü#L #œ #Ì #X
+#ä
+#p #ü #ˆ # +#d +#ì +#x#####¬#Ü#h#ì#|##x#ä#P#¼# #l#°#Ô#ð# #(#D#Ä#<#Ä#J: (pid=%d) AAAARRRRGGGHHH!!! killed by someone...
+J (pid=%d) starts and call nanosleep
+J (pid=%d) ending, nanosleep returns errno=%d, t2=%ld.%ld
+main: pthread_kill on j1, then wait until t=2 sec
+SIGNAL HANDLER: pid=%d
+main: creating J1
+Error creating J1
+main: creating J2
+Error creating J2
+main: creating J3
+Error creating J3
+main: waiting 1 sec
+main: pthread_cancel(J2)
+main: ending...
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ +Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+8Œÿÿ’ÏÿÿšÏÿ¨U#ÿÀ`#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#È]#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5#†5#5#x5#q5#j5#c5#\5#¤"¬"¬"³:#¦:#˜:#‡:#l:#V:#F:#2:##:#:#:#ñ9#à9#Æ9#º9#:#§9#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAšç;#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€Ð+!à+#`,È )¨U#(F /°`#@Q5À`#@Qè :@Q‚CÂb|>iI
\ No newline at end of file
/branches/pj/pse51/ptest4
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest5
===================================================================
--- branches/pj/pse51/ptest5 (nonexistent)
+++ branches/pj/pse51/ptest5 (revision 1085)
@@ -0,0 +1,403 @@
+ELF"4àa4 ( €""H>H> È>HN#HN# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸Tå"fe£hN#Áèfe£nN#HV#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼`#Ç0·%`a#Ç4·%`#£TV#‰XV#HV#êµ"8NV#üèbÑê U‰å‹Eê ‰öU‰åƒìÿ5ìÛ#hð+#èåƒÄÉÐU‰åƒìè};ÉÍvU‰åSƒì,ÆEÙxÆEÚ-ÆEØhô"ƒì‹EØf‰$ÆD$-è¼ ÇEôØ"ÇEð]èEì‰$è0jƒÄ jSjèUÇ$ ,#è‹äÇ$èdƒÄƒì jèN;ƒÄ=„vìƒì jèöcƒÄPh`,#èPäèÃmÇ$,#è?七Ä‹]üÉÉöU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾\V#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
+è֜E¨‰$ècƒÄ…Àyƒì h ,#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=lW#„¶€ú*t€úªt
+€ú6t€ú¶uÆlW#¸é›„Òy,ÆlW#€ú¸uÆxW#ÆnW#ëՀúuÐÆxW#ëljöÆlW#€ú8u€ +xW#ÆnW#멀úu € +xW#뛉ö€ú5uf¾‚#·Àé)v€ú…•f¾ü#·Àé +v€úàuÆlW#éTÿÿÿv€ú*t€ú6u2ÆmW#€ú*u€ +xW#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ +xW# éÿÿÿv€úªt€ú¶u"ÆmW#€úªt €ú¶…öþÿÿÆxW#éêþÿÿ€úFu€=qW#•qW#ë.v€ú:u€=oW#•oW#ëv€úEu;€=pW#•pW#ƒì¶qW#P¶oW#P¶pW#Pèõ¸ƒÄé€úu€ +xW#éhþÿÿv€ú8u€ +xW#éTþÿÿv€út€ú¸uÆxW#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+€úHt€úIu€=pW#uT€=mW#uK·Â +ÿë~€=oW#t/Bð< vBâ<vBÔ<w€=mW#t¶Âf¾€à#·ÀëG€=mW#t¶Âf¾€€‚#·Àë-v€=nW#t¶Âf¾€ ƒ#·Àëv¶Âf¾€à#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  xW#ƒÈ@ë‰ö xW#ˆE؈UيE׈EÚ±»;؁#}8¾`#v݊D2:EÚuŠ2:EØuƒì Wÿ’d#±ƒÄC;؁#|ЄÉuƒìjW¿¢ƒ#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£hW#Šˆâ#ŠPˆã#ŠPˆä#ŠPˆå#ŠPˆæ#ŠPˆç#ŠPˆè#ŠPˆé#ŠPˆê#ŠP ˆë#ŠP
+ˆ‚‚#ŠP ˆƒ‚#ŠP ˆ„‚#ŠP +ˆ…‚#ŠPˆ†‚#ŠPˆ‡‚#ŠPˆˆ‚#ŠPˆ‰‚#ŠPˆŠ‚#ŠPˆ‹‚#ŠPˆì#ŠPˆŒ‚#ŠPˆí#ŠPˆ‚#ŠPˆú#ŠPˆš‚#ŠPˆû#ŠPˆ›‚#ŠPˆ‚#ŠPˆ§‚#ŠPˆ‚#ŠPˆ¨‚#ŠP ˆ ‚#ŠP!ˆ©‚#ŠP"ˆ‚#ŠP#ˆµ‚#ŠP$ˆ‚#ŠP%ˆ³‚#ŠP&ˆ‚#ŠP'ˆ´‚#ŠP(ˆ ‚#ŠP)ˆ«‚#ŠP*ˆ‚#ŠP+ˆ¹‚#ŠP,ˆî#ŠP-ˆŽ‚#ŠP.ˆï#ŠÖˆ‚#ŠP0ˆá#ŠP1ˆ‚#ŠP2ˆü#ŠP3ˆœ‚#ŠP4ˆä‚#ŠP5ˆς#ŠP6ˆЂ#ŠP7ˆт#ŠP8ˆ˂#ŠP9ˆ̂#ŠP:ˆ͂#ŠP;ˆǂ#ŠP<ˆȂ#ŠP=ˆɂ#ŠP>ˆ҂#ŠP?ˆӂ#ŠP@ˆ.‚#ŠPAˆ‚#ŠPBˆ‚#ŠPCˆ*‚#ŠPDˆ΂#ŠPEˆ·‚#ŠPFˆʂ#ŠPGˆþ#ŠPHˆž‚#ŠPIˆ‚#ŠPJˆ°‚#ŠPKˆ‚#ŠPLˆ®‚#ŠPMˆ‚#ŠPNˆ ‚#ŠPOˆò#ŠPPˆ’‚#ŠPQˆ‚#ŠPRˆ¡‚#ŠPSˆ‚#ŠPTˆ¢‚#ŠPUˆ‚#ŠPVˆ£‚#ŠPWˆ÷#ŠPXˆ—‚#ŠPYˆ‚#ŠPZˆ¤‚#ŠP[ˆ‚#ŠPRˆ¥‚#ŠP]ˆ‚#ŠP^ˆ¦‚#ŠP_ˆ‚#ŠP`ˆ²‚#ŠPaˆ‚#ŠPbˆ±‚#ŠPcˆø#ŠPdˆ˜‚#ŠPeˆù#ŠPfˆ™‚#ŠPgˆð#ŠPhˆ‚#ŠPiˆó#ŠPjˆ“‚#ŠPkˆÿ#ŠPlˆŸ‚#ŠPmˆô#ŠPnˆ”‚#ŠPoˆö#ŠPpˆ–‚#ŠPqˆ‚#ŠPrˆ¯‚#ŠPsˆñ#ŠPtˆ‘‚#ŠPuˆ +‚#ŠPvˆ­‚#ŠPwˆõ#ŠPxˆ•‚#ŠPyˆ ‚#ŠPzˆ¬‚#ŠP{ˆ:ƒ#ŠP|ˆ;ƒ#ŠP}ˆGƒ#Š@~¢Hƒ#]ÍvU‰åWVSƒì\‹]}ؾ€W#ü¹󥿸ƒ=tW#…Qº¾à#¹€‚#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇChV#ƒì ÿsèûÿÿÇ$jjjhÙ,#èϔf£¢ƒ#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhÙ,#è0˜f£¤ƒ#ƒÄfƒøÿuƒì ¿¢ƒ#P蕛¸ýÿÿÿ頍vÇ؁#ƒ{ÿuÇC "ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+ÇE̍E¨ë‹ƒì jjPh¨"hâ,#èÿ‰ÃƒÄ ‰¨ƒ#ƒøÿu'ƒì ¿¢ƒ#P蓚¿¤ƒ#‰$脚‰Ø钐ƒ=|W#uWƒì ÿ5¨ƒ#艉ǃąÿt4ƒì ¿¢ƒ#PèLš¿¤ƒ#‰$è=šƒÄÿ5¨ƒ#èg5¸üÿÿÿë=Ç|W#ëèƒì¶qW#P¶oW#P¶pW#PèûÇtW#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿¤ƒ#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿¤ƒ#Pèõ›·ÀƒÄÉÐU‰åSƒ=؁#0‹ +؁#Í»`#‹Ef‰ŠE
+ˆD‹E ‰‚d#A‰ +؁#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=tW#t9蓃ì ÿ5¨ƒ#è-4¿¢ƒ#‰$è昿¤ƒ#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$È,#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t +‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t +‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆŒW#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ƌW#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=ŒW#„þÆŒW#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆŒW#¸eô[^_]ÃU‰åVS¡ W#…Àt¡ W#H£ W#¸é²¸ë6ƒ=˜W#uKŠœW#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜W#뤍v¸ë:ƒ=˜W#uGǘW#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡¤W#@£¤W#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆW#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=ŒW#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡¤W#@£¤W#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîƍW#¸eô[^_]ÍvU‰åƒìÇĄ#ÇÀ„#ƒ=”W#t!úè‹õÿÿ£W#Ç”W#û…Àtúèôÿÿû¡W#…ÀuƒìÿuhŒ "jèQ¸ƒÄÉÍvU‰åVS¡ W#@£ W#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ W#@£ W#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡À„#@%ÿ£À„#Š€Àƒ#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=¬W#t(Ç$…#Ç …#Ç(…#ǬW#‹E£¨W#ƒ=”W#t!úèôÿÿ£W#Ç”W#û…Àtúèòÿÿû¡W#…Àu.¸ìÿÿÿ€=ŒW#t ƒìjÿhÈ "j èOƍW#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ …#@ƒà?£ …#ºà„#ŠˆA¡ …#@ƒà?£ …#Šˆ¡ …#@ƒà?£ …#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=W#tèäùÿÿƒì j èŽOƍW#¸ƒÄÉÐU‰åƒìƒ=”W#t!úè óÿÿ£W#Ç”W#û…Àtúè™ñÿÿû¡W#…Àt¸ë¶ŒW#ÉÍvU‰åVSŠEŠU€} t ƒ +œW#ë ‰öƒ%œW#„Àt ƒ +œW#ëƒ%œW#„Òtƒ +œW#ë¸ë6¸ëbƒ%œW#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜W#[^]ÐU‰åSƒìœúX‰Ã€=W#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡À„#;Ą#t¡Ä„#ˆˆÀƒ#@%ÿ£Ä„#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=(…#u €úúu¡¤W#H£¤W#郍v÷ÂÀuxÿ(…#œúX‰Á¡ …#;$…#t¡$…#ˆà„#@ƒà?£$…#ë"‰ö¡$…#+(…#ƒÀAƒà?£$…#Ç(…#‰ÈPƒ=(…#uÇ(…#ƒì ÿ5¨W#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ÅèÜ#uèùÝNj¸ÿÿÿÿ鏐ƒ=ÀÛ#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€ÁÜ# t ÿ€ÄÜ#ë-v‹EÑàE‰ÂÁâ)‹ÕÄÜ#ƒì‹• Ü#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€ÁÜ# t ÿ€ÄÜ#ë2v‹EÑàE‰ÂÁâ)‹ÕÄÜ#ƒì‹• Ü#ÿuRÿP@蔃ĉØPé­úèJ²‹ìÛ#R‰ÑÁá)Ñ»ÀÜ#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€ÄÜ#ë?vƒìU‰ÐPjÿèW#‹MI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@è/ƒÄ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ=ÀÛ#„“œúX‰ÇÇEð}ð™s¾ÀÜ#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€ÄÜ#ë6ƒìEðPjÿèW#‹MðI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾ÀÜ#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€ÄÜ#ë8vƒìEðPjÿèW#‹MðI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ÇEð}ð™w¾ÀÜ#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€ÄÜ#ë8v‹MðI‰ÐÁà)ЋÅÄÜ#ƒì‹• Ü#QRÿP@ƒÄEðPjÿèW#ƒÄÿEð}ð™~èÞ ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jèl–ƒÄUð¡¨Ü#;øÛ#|¡¤Ü#+ôÛ#‰Eð¡¨Ü#+øÛ#ë!‰ö¡¤Ü#+ôÛ#H‰Eð¡¨Ü#+øÛ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qè. ƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRLè{ ƒÄhìÛ#jÿèW#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèV ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìhL'"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=´W#u(èè
+ƒì ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#Pèt­ƒÄÉÍvU‰åWVSƒìhê,#è]$ƒÄ»ÀÜ#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hdÜ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾ÀÜ#¡°W#‰3@£°W#‹E ‰DƒìjÿuƒÔÜ#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B +‰ƒÀÜ#¿ÄÜ#Ç;¾ÈÜ#¡ìÛ#@‰ÂÁâ)‹DÖ0‰3ºÌÜ#ǍAP‹]ð‰˜ÀÜ#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁ Ý#°Ç8Ç0ǁÁÀǁÀÜ#Ç9ºۍƒ€ 
+Ç…$Ý#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂÈÜ#ÿÿÿÿǂÌÜ#Ý#‰Ý#º‹Mðɍ€ ‰ö
+Ç…Ý#Bƒú~ì»ëC;ðÛ#sƒì‹ Ü#ÿuSÿPƒÄ…Àxß;ðÛ#u7‹]ð[‰ÂÁâ)ÂfÇÕèÜ#ƒìhdÜ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžÄÜ#ƒì‹ Ü#ÿuÿuðSÿP,ƒÄ…ÀyWfdžèÜ#ƒìhdÜ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5äÛ#s0ƒìµ‹ƒ€Ü#WVÿP ƒÄ…Àxۃ싃€Ü#WÿuðVÿP$ƒÄ;5äÛ#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰ÕÌÜ#‰Æ‹UÑâU‰ÐÁà)Ѓ ÅðÜ#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅîÜ#Pè@‹UÑâU‰ÑÁá)Ñ»ÌÜ#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»ÀÜ#·DÓ.ƃì ·GPjÿwVh8."è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ ÕÈÜ#ƒìU‰ÐPjÿèW#ƒÄöGu ÿàÛ#ëvöGuÿ Ü#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅÄÜ#‹… Ü#ƒx(„èà…À‰€»;äÛ#svƒì‹€Ü#VSÿP(ƒÄC;äÛ#råv‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿR0fǃèÜ#ƒÄhdÜ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;äÛ#svƒì‹€Ü#VSÿP(ƒÄC;äÛ#råv‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿR0fǃèÜ#ƒÄhdÜ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡ìÛ#@‰ÂÁâ)¾ÀÜ#SÿTÖú‰$èn¡ìÛ#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàºÀÜ#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸ÄÜ#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹ÈÜ#‰Mì‹Uä‹
+‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…$Ý#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ +ìÛ#I‰ÐÁà)ЍÅö‚ðÜ#tɍ€È‚xÝ#…$Ý#¡¤Ü#;ôÛ#|;ôÛ#uA¡¨Ü#;øÛ#}4ƒìSÿ5ìÛ#ÿ5øÛ#ÿ5ôÛ#ÿ5¨Ü#ÿ5¤Ü#h-#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ +ìÛ#I‰ÐÁà)ЍÅöƒðÜ#„›ɍ€ȍ‹°ÈÜ#ºÄÜ#‹t‚`‹”À¸ÌÜ#94s‰4‹ìÛ#[‰ÁÁá)ÁÁፁÀ°ÀÜ#¿ÄÜ#B‰8±°‹†ÈÜ#@º‰Ñº÷ñ‰–ÈÜ#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàºÀÜ#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹ՀÝ#‰…ötI‰ÂÁâ)‹Õ|Ý#‰…ÿtI‰ÂÁâ)‹ՄÝ#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕxÝ#‹…$Ý#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàºÀÜ#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂ÀǀÀÜ#ǀÄÜ#ǂ|Ý#û¸]ÍvU‰åWVSƒì ƒ=ìÛ#ÿt¡ìÛ#@‰ÂÁâ)ÂöÕðÜ#…3ƒ=ìÛ#ÿ„ƒìh¤Ü#j證ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#ë"v¡¤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QènüÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)Ћ<ÅÄÜ#ƒì‹½ Ü#QWÿP<ƒÄ¿4½ƒì ‹† Ü#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅÄÜ#‹… Ü#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5ìÛ#‰Ü#‰ìÛ#[‰ÐÁà)Ð;ÅÝ#t0»ÀÜ#‰ö¡ìÛ#@‰ÂÁâ)‹TÓP‰ìÛ# R‰ÈÁà)È;TÃPu×;5ìÛ#tƒìhìÛ#jÿèW#ƒÄ‹ +ìÛ#I‰ÐÁà)ÐÁà¾ÀÜ#fÇD(‹¸ÄÜ#ƒì‹½ Ü#‹Ü#¸;ìÛ#•ÀPQWÿS8¡ìÛ#@‰ÂÁâ)ƒÄöDÖ1„Ü¡Ü#;ìÛ#…Ë¡¤Ü#‰EèMè¡ìÛ#@‰ÂÁâ)»ÌÜ#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5¨Ü#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡ìÛ#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjhd<"ÿuìÿuèÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèû7ƒÄ‰üÛ#¡¤Ü#£ôÛ#¡¨Ü#£øÛ#eô[^_]ÉöU‰åWVSƒìÇPœ%úÿuèD»ƒÄ¿ÄÜ#¾ÀÜ#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂÌÜ#ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀÈÜ#ǀÌÜ#‚Ý#Ç@Çǂ Ý#BP‰0Ç8ÇD`DŽÐ‚˜ß#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀÈÜ#ǀÌÜ#ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀÈÜ#ÿÿÿÿǀÌÜ#ºۍƒ€ 
+DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹ÈÜ#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇÀ™%ÿÿÿÿ»™¹ÌÜ#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇÝ#ÿÿÿÿÇdÜ#ÇèÛ#ÇàÛ#Ç Ü#ÇÜ#ÿÿÿÿÇìÛ#ÿÿÿÿÇüÛ#ÿÿÿÿÇøÛ#ÇôÛ#ÇðÛ#ÇäÛ#ÇÀÛ#èÚè}è42ƒì ÿuèqÉÿÿ£hÜ#ƒÄ=×Övƒì h`-#èÇ$è »ƒÄ¸ƒ=hÜ#”À‰Eè]è¡hÜ#‰CÇPœ%躂ƒì S豌Ç$ø<"èÇÇ$8'"聎Ç$P<"蕎ƒÄjjèEÿðW#ƒÄh¤Ü#jèLƒèOùÿÿèê›f£`Ü#¡ìÛ#@‰ÂÁâ)¾ÀÜ#¿DÖ‰$èϛÇ$è7ŽÿìW#ÇPœ%ƒÄ»ƒ=èÛ#ŸÃSjèɃă= Ü#teè„ Ç´W#ƒìh¤Ü#j軂è^›f£`Ü#è³øÿÿÇ$P<"èǍ¡ìÛ#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇPœ%ƒìSjèCèÇPœ%ƒÄjjè(ƒÄúƒ=èÛ#t"ƒìÿ5èÛ#h‹-#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=´W#…•èW‰…Àuú腚‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹E£èÛ#Ç´W#ƒ=ìÛ#ÿ„ƒìh¤Ü#j藁ƒÄUð¡¨Ü#;øÛ#|¡¤Ü#+ôÛ#‰Eð¡¨Ü#+øÛ#ë ¡¤Ü#+ôÛ#H‰Eð¡¨Ü#+øÛ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèZôÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿR<ÇÜ#ÿÿÿÿÇìÛ#ÿÿÿÿƒÄèü‡…Àtƒì ¿`Ü#Pè,™ƒÄëvƒì ¿`Ü#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»º Ü#¡ Ü#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwº Ü#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇüÛ#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=Pœ%tƒ= Ü#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸èÛ#ƒ=ìÛ#ÿt‹ìÛ#R‰ÐÁà)ЍÅ Ý#]ÉöU‰åSƒìœúX‰Ãƒ=Pœ%tƒ= Ü#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹H…#t[¿@…#ƒ<9tP‹ìÛ#ҍ‚€Ð؍…оÀÜ#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹ìÛ#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt +ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾@…#»D…#¹H…#vRÁàÇ0B‰Çƒú~ãÇ8‹#ÿÿÿÿÇ@‹#ÇH…#Ç@…#ÇD…#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=@‹#ÿu û¸ ënv¡@‹#@Ç•H…#‰¡@‹#@‹…D…#£@‹#‹@‹U ‰…@…#º»ÀÜ#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡ìÛ#À’ÂU‹•Ý#û]ÍvU‰å‹Múƒùw +Iƒ<…H…#u û¸ë%v¡ìÛ#À’ÂʋE ‰•Ý#û¸]ÃU‰åS‹]œúX‰Áƒûw +[ƒ<…H…#u‰ÈP¸ë.v[Áà‹@‹#‰D…#ǀH…#‰@‹#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡ìÛ#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿ÀÜ#öD0 tm‹E‰‚ŒÝ#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºÈÜ#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿRD‰tPƒÄ¹»ÀÜ#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<ÅÝ#t[»ÄÜ#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»ÀÜ#¿DÓPèÔyƒÄEðPjÿèW#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4ÕÌÜ#èÁ ƒÄ»;äÛ#sƒì‹€Ü#ÿuðSÿP(ƒÄC;äÛ#rã‹MðI‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRPÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕðÜ#u&ÿ +àÛ#ƒ=àÛ#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕðÜ#uÿ + Ü#ƒ= Ü#uèúÿÿƒìh¤Ü#jèÒyƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàºÀÜ#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅñÜ#tû雉ö;5ìÛ#uJv‰ÐÁà)лÀÜ#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)Ё ÅðÜ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡Ü#@‰ÂÁâ)Âf‹Mòf; ÕìÜ#”Eñ¾¿ÀÜ#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5ìÛ#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡Ü#@‰ÂÁâ)¿ÕÈÜ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿ÀÜ#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+uB»ë‰öC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡ìÛ#@‰ÂÁâ)»ÀÜ#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡¸W#ʼnŠ`‹#‰šd‹#@£¸W#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=”Ž#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ +”Ž#‰ÊÁâ‹‚ Œ#£”Ž#‹E‰‚Œ#‹E ‰‚Œ#‰ðƒà‰‚Œ#‰ðƒàƒøtOƒø
+ƒøt +ësvƒøtSëi‰ÈÁàǀ Œ#ÿÿÿÿƒ=€Ž#ÿu‰ +€Ž#ë¡„Ž#Áà‰ˆ Œ#‰ +„Ž#ëH‰ö‰ÊÁ⡈Ž#‰‚ Œ#‰ +ˆŽ#ë.‰ÊÁâ¡ŒŽ#‰‚ Œ#‰ +ŒŽ#ë‰ÊÁ⡐Ž#‰‚ Œ#‰ +Ž#‰ØP¸[^]ÐU‰åƒìƒ=ðÛ#uƒì hÀ-#èŒÇ$謃ġðÛ#P‰ðÛ#ÉÐU‰åƒìƒ=äÛ#uƒì hß-#èPÇ$èÌ«ƒÄ¡äÛ#P‰äÛ#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèU¸ÿÿƒÄeô[^_]ÉöU‰å¸¹ Œ#v‰ÂÁâ@‰
+ƒø&~òÇ|Ž#ÿÿÿÿÇ€Ž#ÿÿÿÿÇ„Ž#ÿÿÿÿLjŽ#ÿÿÿÿÇŒŽ#ÿÿÿÿǐŽ#ÿÿÿÿÇ”Ž#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹€Ž#Ç€Ž#ÿÿÿÿë:‰ö‹ˆŽ#LjŽ#ÿÿÿÿë&‰ö‹ŒŽ#ÇŒŽ#ÿÿÿÿë‰ö‹Ž#ǐŽ#ÿÿÿÿÇÀÛ#ƒûÿtM¾ Œ#…ÿt‰ØÁàƒ¸Œ#uƒì ‰ØÁàÿ°Œ#ÿŒ#ƒÄ‰Ù‰ØÁà‹0‰Â¡”Ž#‰2‰ +”Ž#ƒûÿu¸ÇÀÛ#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$ Ž#èÅӃÄjjhÿÿjh¤Ž#h Ž#èðɃÄjjhÿÿÿhhÀŽ#h Ž#èÐɃÄjjhÿÿÿþhh܎#h Ž#è°ÉƒÄ ƒ}ütƒì‹EüHPÿuøh Ž#èzȃă}ôtƒìÿuôÿuðh Ž#è^ȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh Ž#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh Ž#è¸ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh Ž#è²ËƒÄ ÉÐU‰åƒì ÿu ÿuh Ž#èfЃÄÉÐU‰åƒìÿuh Ž#èM΃ÄÉÃU‰åƒìÿuh Ž#èM҃ÄÉÃU‰åƒì jÿuh Ž#èSɃÄÉÉöU‰åƒì ÿu ÿuh Ž#èþσÄÉÐU‰åƒìh Ž#è ÎÇ$ Ž#è ҃ÄÉÍvU‰åWVSƒì} ‹uEðPh4.#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;¼W#~hƒìWVh#蜃Äj
+VèK›ƒÄ»…À•ÃœúX‰Æƒìh#‹Eðÿ4…ÀW#h9.#è]™ƒÄ…Ûuƒì hÜ.#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4.#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;¼W#~JƒìVSh#èB›ƒÄj
+S臚ƒÄœúX‰Ãƒìh#‹Eôÿ4…ÀW#h9.#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5“#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5“#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuhA.#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5“#èc6ƒÄÉÉöU‰åƒìÿ5“#èc6ƒÄÉÉöU‰åƒìÿ5“#è{5ƒÄÉÉöU‰å‹E‹U ‹M£“#‰“#‰ +“#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5“#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5“#è3‰ÃƒÄ…Ûu#ƒìÿ5“#èx5ƒÄ+PWÿ5“#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5“#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5“#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u +ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹˜ß#‰U苀œß#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;՘ß#|[‰Eäv1‰ÐÁà)ЍÅ;š˜ß#u ‹Eì;‚œß#|1‰Ï‰ÐÁà)Ћ ÅÝ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Řß#}«ƒÿÿt‰ÐÁà)ЋU‰ÅÝ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лÄÜ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»ÈÜ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰ÅÝ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹ÌÜ#‹°ÈÜ#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»ÈÜ#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»ÌÜ#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋÅÝ#‰ƒøÿt@‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰ÕÝ#[‰ÂÁâ)ÕP‹‰‚ÈÜ#ǂÌÜ#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡ìÛ#@‰ÂÁâ)4ÕÀÜ#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ •#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì R范ċ^8‰Ø÷Ћ + •#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ÅèÜ#u +¸éӍvú‰ÈÁàö€(“#uƒ¸ “#uû魉öv‰ÐÁà)ЍÅüÜ#ƒùvèÍ©Çë
+¸Óà »ëC;äW#}ƒìÝÿ°ä•#Vÿà•#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»èÜ#u&ƒìh$•#VèÔüÿÿ‹ƒÄÜ#ƒÄ‹… Ü#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ “#ü¹‹}ó¥…Òt‰ßÁçÇ “#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<@•#ÿtq4‰uìº@•#‹@Áà‰Eè‰ÇƒÇ‹ +`¢%¸`œ%‹U苉E䋇dœ%©t +ƒàý‰‡dœ%ë‰ö¾@•#‹Uì‹2@‰ Õ`œ%‰Áƒ}äÿu»‰ +`¢%ǝ@•#ÿÿÿÿƒûv +è¨Çë¸þÿÿÿˆÙÓÀ! •#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}ØÆ “#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà# •#…Àt +‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà  •#‹5$•#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅÝ#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸èÜ#uüÜ#ƒûv +輦Çë 8ƒìh$•#Vèúÿÿv‰ÃÁã)ÃÁ㋃ÄÜ#ƒÄ‹… Ü#VPÿRDÃà¾ÀÜ#ƒÄƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4ÅÝ#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸èÜ#„…øÜ#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅüÜ#ƒûvèÃ¥Çëv 8»ëvC;äW#}0ƒìÝÿ°ä•#Vÿà•#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 +‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}ØÆ “#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà# •#…Àt ‹UԉÐPéÃ=`¢%ÿu‹MԉÈP¸ 鮉ö‹5`¢%vÁà¹`œ%‹‰`¢%‹U ‰dœ%‹U‰hœ%‹U‰lœ%‹ìÛ#‰pœ%Çÿÿÿÿ‹E Áàº@•#ƒ<ÿu‰4ë>‰ö‹M ‹@•#‰ÁЃ<Å`œ%ÿt»`œ%
+‹Í 
+ƒ<ÃÿuîR‰4Å`œ%ƒ} vèé£Ç됸ŠM Óà  •#‹5$•#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅÝ#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸èÜ#uüÜ#ƒ} vèS£Çëv ƒìh$•#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃ÄÜ#ƒÄ‹… Ü#VPÿRDÃà¾ÀÜ#ƒÄƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4ÅÝ#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸èÜ#„…øÜ#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅüÜ#ƒ} vèV¢Çë‰ö »ëvC;äW#}0ƒìÝÿ°ä•#Vÿà•#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=àW#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡ìÛ#@‰ÂÁâ)<ÕÀÜ#èŠú¡ •##„Hºv©u=BÑøuô¾ƒ<µ@•#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ! •#ûév µº@•#‹[‹Å`œ%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ! •#W<ƒþv +èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹dœ%‹
+‹u ‰‹‚hœ%‰F‹‚lœ%‰FƒÂ‹
+©t ƒàý‰
+ëv[¡`¢%‰Õ`œ%‰`¢%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u +û¸ éÓ‰ö‹‰G@úèu‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jèN\ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèÏÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRHƒÄh$•#ÿ5ìÛ#èæòÿÿ¡ìÛ#@‰ÂÁâ)ÂfÇÕèÜ#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày +ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5ìÛ#hän"ÿuÜÿuØÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèù ƒÄ¡ìÛ#@‰ÂÁâ)‰Õ ß#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿè‡Ðÿÿƒì ¡ìÛ#@‰ÂÁâ)»ÀÜ#¿DÓPèsè”ÇG@¡ìÛ#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡ •##„ûº‰ö©uáBÑøuô¾ƒ<µ@•#ÿu=‹M ‰1ÇAÇAƒþv +è@Çë¸þÿÿÿ‰ñÓÀ! •#ûé vƒì µƒ@•#Pèúðÿÿ‰ÇƒÄƒ»@•#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ! •#Áâ¹dœ%‹
+‹] ‰‹‚hœ%‰C‹‚lœ%‰CƒÂ‹
+©t ƒàý‰
+ëv¡`¢%‰Õ`œ%‰=`¢%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡ìÛ#@‰ÂÁâ)4ÕÀÜ#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jè6XƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèúÊÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRHƒÄh$•#ÿ5ìÛ#èÍîÿÿ¡ìÛ#@‰ÂÁâ)»ÀÜ#fÇDÓ(ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿè Íÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=ȕ#ÿu
+ÇEèëWMèUð¡Ä•#;B|¡À•#+Eð‰Eè¡Ä•#+Bëv¡À•#+EðH‰Eè¡Ä•#+Eôʚ;‰Aƒì ÿ5ȕ#ÿÈÛ#ƒÄ…ÛtN]ð‹Eð£À•#‹Eô£Ä•#jhDo"ÿuôÿuðÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè:ƒÄ‰ȕ#ë +vÇȕ#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ@•#ÿuC‰uèÇEìÇEð¡ìÛ#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ! •#降 µº@•#‹[‹Å`œ%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ! •#[Áà¹dœ%‹‰U苐hœ%‰U싐lœ%‰Uð‹pœ%‰UôP‹
+©tƒàý‰
+ë[¡`¢%‰Õ`œ%‰`¢%ƒìEèPVè
+ƒÄeø[^]ÃU‰åVSƒì¡ìÛ#@‰ÂÁâ)4ÕÀÜ#‹F0©…Í +‰F0‹F8‰Ã÷Ћ •#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ + •#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+CÑøuòº‰UèÇEìÇEð¡ìÛ#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡ìÛ#@‰ÂÁâ)ÕÀÜ#‰UЉÞÁæ}ØÆ “#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShL.#èw}ƒÄ÷Eàtƒì‹M ÿqhb.#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv +èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv +è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾ÀÜ#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄƒìh$•#Wèúèÿÿ‰ÂÁâ)‹ÕÄÜ#ƒÄë ‰ÐÁà)ÐÁàfƒ¸èÜ#u!‹ÄÜ#ƒì‹• Ü#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿(“#¾$“#»,“#¹@•#‰ö‰ÐÁàǀ “#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»`œ%¹dœ%RÁàB‰ÇDƒú>~éÇH¢%ÿÿÿÿÇ\¢%Ç`¢%Ç •#Ç$•#ÿÿÿÿÇȕ#ÿÿÿÿº¹€–#»„–#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhÄi"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu +‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5ìÛ#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡ìÛ#@‰ÂÁâ)¡ •# ÕüÜ#‰¸]ÉöU‰åSƒì‹E‹U ú‹ìÛ#‰ìÛ#ÇàW#jPj jèœìÿÿƒÄÇàW#‰ìÛ#û‹]üÉÍvU‰åS‹M‹] ¡äW#ʼnŠà•#‰šä•#@£äW#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…ˆ–#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹€–#‹E ‰
+‹E‰‚„–#ÆD
+ƒìjh„o"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹ìÛ#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸ÀÜ#DŽàÿÿÿÿL0ƒìh$•#Vèõãÿÿ‹ƒÄÜ#ƒÄ‹… Ü#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇȕ#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿèW#‹UüRÁเ–#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…„–#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=@ž#ÿt ƒ=`¢%ÿuûèƒÇ ¸ÿÿÿÿéCv¡@ž#‰‹@ž#Õ)пD—#‹DÇ0£@ž#‹Õ)й@—#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅH—#닍<Å)Ǎ<ý@—#ü¹ó¥‹Õ)ЍŃº@—#u#¡`¢%‰‚h—#@Áàƒˆtœ%‹€`œ%£`¢%‹Õ)ÐÇÅT—#ÿÿÿÿ‹Õ)ЍÅX—#Ç@NjÕ)ЍÅ`—#Ç@NjÕ)ÐÇÅl—#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Åp—#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀp—#ƒÀºD—#ƒ<ÿtƒì ÿ4ÿÈÛ#ƒÄÝ)ØÁàƒ¸@—#uE‹h—#R Åötœ%u¡`¢%‰`œ%‰`¢%Ý)؋Åh—#@ƒ$Åtœ%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸@—#…‹P ‹‚H—#@öÅtœ%t¸L—#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJL—#¾H—#‹7@‹`¢%‰Ý`œ%£`¢%jÿ41ÿ±D—#jèhçÿÿ‹7@ƒ Åtœ%錐‹E´Áà+E´Áà¹@—#ƒ<uwPƒ<
+tÿ°H—#ÿ°L—#ÿ4
+ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´ÁàH—#Rÿ°L—#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸H—#u +ƒ¸L—#„Àº`—#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒX—#‰ƒ`—#‹Aƒ\—#‰B…Àyÿ‹`—#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hPr"ÿ4Åd—#ÿ4Å`—#ÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè+ùÿÿƒÄ‹E´Áà+E´‰ÅT—#ë‰ö‹E´Áà+E´ÇÅT—#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Åp—#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<ÅT—#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹`—#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹`—#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹X—#õ)ðÁà‹‰‹D‰Gõ)ðÅºD—#ƒ<ÿtƒì ÿ4ÿÈÛ#ƒÄ‹Eƒxu
+ƒx „þºX—#õ)ð ŋ]‹‰
+‹C‰D
+÷E t¸`—#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘`—#‹Eè‹]C‰`—#‹EìC ‰B…Àyÿ‰`—#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhPr"ÿ4Åd—#ÿ4Å`—#ÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè­öÿÿƒÄõ)ð‰ÅT—#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Åp—#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<ÅT—#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹`—#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹`—#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹X—#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt +ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Åp—#uûè܆ǸÿÿÿÿëvÕ)ЋÅl—#ûÉÐU‰åWVS¹»D—#¿@—#¾L—#‰öÍ)ÈÁàÇDÿÿÿÿX—#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ<ž#ÿÿÿÿÇ@ž#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡ìÛ#@‰ÂÁâ)¾ÀÜ#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡ìÛ#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡ìÛ#@‰ÂÁâ)¹ÀÜ#‹DÑ0Áèƒà‹U ‰¡ìÛ#@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡ìÛ#@‰ÂÁâ)¹ÀÜ#‹DÑ0Áè ƒà‹U ‰¡ìÛ#@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5äÛ#s9v‹µ€Ü#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5äÛ#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…€Ü#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µ Ü#ƒìÿ°ôh™.#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°ÄÜ#……ƒÀ ºÀÜ#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀP訃Äë%v·Ð¸s.#ú€t¸.#út¸‹.#P[‰ÐÁà)ÐÁàÿ°”ß#ÔÜ#PSh/#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹… Ü#‰Eð‹¸üƒì ‹Uð‹‚ðøPèk§‰ÆƒÄƒþÿu +¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ ÅöñÜ#tRQ@»ÌÜ#ƒ<D‹¤ß#‰ƒìý‰Ø‹Uð‚ðPVèX¥ƒÄ‹Eð˜ðSV聦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹… Ü#‰Eð‹Mƒy(…©‹=ìÛ#‰ÐÁà)ЍžÄÜ#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йÌÜ#‹D@‰D@‹„à‰„àƒÂ0¹ÀÜ#‹
+%ÿ÷ÿÿ‹\0ã ؉
+‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»ÄÜ#‹A‰„Ѓyt‹A‰‚ Ý#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰ Ý#‹“ô‰¤ß#ƒy$u‹E @‰ÐÁà)Ё ÅðÜ#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<• Ü#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋŔß#‹—ðÂPÿu 襤酋E @‰ÐÁà)ЍÅöƒñÜ#t?K@¾ÌÜ#ƒ<11ºÄÜ#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èG¤ë*ƒì‹E @‰ÐÁà)ЋŔß#‹—ðÂPÿu 诣ƒÄ‹E @‰ÐÁà)ÐfÇÅèÜ#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã +f‰E¸‹ Ü#‹€ø‰EÈÇE̍E¸jjPh"h¥.#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì h@/#èVËÿÿƒÄ‹< Ü#v‰ÐÁà)Ðfƒ<ÅèÜ#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃Ý#PjèJ;fǃèÜ#€ƒÄ‹ƒ”ß#‹—ðÂPVèࢃčeô[^_]ÐU‰åWVSƒì‹}hª.#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPhÀ.#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄShÞ.#è‡Êÿÿ‹Eð‰… Ü#ƒÄ jhê.#Sè=efÇCÆCÇCø…"ÇC$†"ÇC ì{"ÇC$Ì|"ÇC(0†"ÇC,Œ}"ÇC0<†"ÇC4D†"ÇC8P†"ÇC<"ÇC@†"ÇCD‡"ÇCHd‡"ÇCLl‡"ÇCPˆ"ÇCTLˆ"ÇCX€ˆ"ÇC\d‰"ÇC`„‰"ÇCdœ‰"ÇCh´‰"ÇCl̉"ÇCpä‰"ÇCtü‰"ÇCxŠ"ÇC|,Š"ǃ€DŠ"ǃ„\Š"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè柃ÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh€"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹ Ü#‰Eð…Éx[; +ðÛ#sS‹ Ü#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ÅèÜ#u +¸éèvv‰ÐÁà)Ð9 ÅÄÜ#t +¸&éȍv…Ûuv‰ÐÁà)Ё ÅðÜ#ë)ƒûuv‰ÐÁà)Ё$ÅðÜ#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿ÄÜ#‹U9;t\f¸èÜ#€u=ƒì‹;‹Mð‹‘ðÂPV蘞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV赟ƒÄëv‰ÐÁà)ЋU‰Ŕß#¸eô[^_]ÍvU‰åVS‹M‹4 Ü#…Éx; +ðÛ#s‹ Ü#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡ìÛ#@‰ÂÁâ)¸ÿÿÿÿ9 ÕÄÜ#uZúè!P‹ìÛ#R‰ÑÁá)Ñ»ÀÜ#f‰DËdžèX­ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹… Ü#‹€ü]ÍvU‰å‹E‹… Ü#‹€ô]ÍvU‰åS‹]‹M …ÛxU;ðÛ#sM‹ Ü#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ÅèÜ#u¸ëMI‰ÐÁà)Ð9ÅÄÜ#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öñÜ#”À‹U‰‹‘”ß#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E +9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹… Ü#I‰ÐÁà)ЋŔß#‹“ðÂPQè7œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<… Ü#v‰ÐÁà)Ðfƒ<ÅèÜ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃Ý#PjèR5fǃèÜ#€ƒÄ‹ƒ”ß#‹—ðÂPVè蜃čeô[^_]ÐU‰åSƒì ‹E‹M ‹… Ü#I‰ÐÁà)ÐÁàfǀèÜ#€‹€”ß#‹“ðÂPQ蜜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹• Ü#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃Ý#Pjè‹4ÿ 7ƒÄ‹ƒ”ß#‹Mð‹‘ðÂPÿu 趛fǃèÜ#€ƒÄë‹E @‰ÐÁà)ÐfÇÅèÜ#eô[^_]ÐU‰åƒì‹E‹M ‹… Ü#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅèÜ#hdÜ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹… Ü#ƒÀDŽ€R‰ÐÁà)ÐfÇÅèÜ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅèÜ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhtŠ"ÿuìÿuèÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ ß#eô[^_]ÐU‰åƒìÿ5ìÛ#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5ìÛ#jèñãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèÙãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèÁãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè©ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèyãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèaãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèIãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè1ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºÄÜ#‹‹4… Ü#¿ÀÜ#fÇD(€‹„Ћ–ðÂPQè9™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h`0#è
+Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µ Ü#ƒÄ jhø/#Sè®[fÇCÆCÇC Œ"ÇCTŒ"ÇC `Œ"ÇC$ˆŒ"ÇC(ÇC, Œ"ÇC0¬Œ"ÇC4´Œ"ÇC8ÀŒ"ÇC<Ȍ"ÇC@äŒ"ÇCD "ÇCH4"ÇCL\"ÇCP„"ÇCT¬"ÇCXԍ"ÇC\ü"ÇC`(Ž"ÇCdPŽ"ÇChxŽ"ÇCl Ž"ÇCpȎ"ÇCtðŽ"ÇCx"ÇC|@"ǃ€h"ǃ„"ǃˆÿÿÿÿÇ$0#èô¿ÿÿƒÄ jVh¸"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹ Ü#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹… Ü#ÿ°ˆhe/#èìYƒÄÉÍvU‰å‹E‹… Ü#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕèÜ#]ÃU‰åƒìht/#èxYƒÄÿ5ìÛ#j è„àÿÿƒÄÉÍvU‰åƒìh{/#èPYƒÄÿ5ìÛ#j è\àÿÿƒÄÉÍvU‰åƒìh‚/#è(YƒÄÿ5ìÛ#j è4àÿÿƒÄÉÍvU‰åƒìh‰/#èYƒÄÿ5ìÛ#j è àÿÿƒÄÉÍvU‰åƒìh/#èØXƒÄÿ5ìÛ#j èäßÿÿƒÄÉÍvU‰åƒìh—/#è°XƒÄÿ5ìÛ#j è¼ßÿÿƒÄÉÍvU‰åƒìhž/#èˆXƒÄÿ5ìÛ#j è”ßÿÿƒÄÉÍvU‰åƒìh¥/#è`XƒÄÿ5ìÛ#jèlßÿÿ¸ƒÄÉÉöU‰åƒìh¬/#è4XƒÄÿ5ìÛ#jè@ßÿÿƒÄÉÍvU‰åƒìh³/#è XƒÄÿ5ìÛ#jèßÿÿƒÄÉÍvU‰åƒìhº/#èäWƒÄÿ5ìÛ#jèðÞÿÿƒÄÉÍvU‰åƒìhÁ/#è¼WƒÄÿ5ìÛ#jèÈÞÿÿƒÄÉÍvU‰åƒìhÈ/#è”WƒÄÿ5ìÛ#jè ÞÿÿƒÄÉÍvU‰åƒìhÏ/#èlWƒÄÿ5ìÛ#jèxÞÿÿƒÄÉÍvU‰åƒìhÖ/#èDWƒÄÿ5ìÛ#jèPÞÿÿƒÄÉÍvU‰åƒìhÝ/#èWƒÄÿ5ìÛ#jè(ÞÿÿƒÄÉÍvU‰åƒìhä/#èôVƒÄÿ5ìÛ#jèÞÿÿƒÄÉÍvU‰åƒìhë/#èÌVƒÄÿ5ìÛ#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPhD"hò/#趜ÿÿƒÄ ‹ Ü#‰Ã‰šˆƒûÿuƒì h 0#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅøÜ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàº`ž#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…dž#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹0¿#ƒúÿtqÕ)Ѝ<…w‹†dž#£0¿#ƒì ÿuèV@‰$臹ÿÿ»`ž#‰ƒÄÿuPè7U‹Eð‰‡hž#‡lž#‰$è(‘ÆDƒÄû‡dž#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»`ž#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾`ž#ÿ43è%¹ÿÿƒÃÆD3¡0¿#‰ƒdž#‰=0¿#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…xž#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ4…`ž#ƒ~ ÿu
+ƒ~…“ƒìWjÿèW#ƒÄh¤Ü#jè8)ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#ë!‰ö¡¤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qèú›ÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRH‹ +ìÛ#I‰ÐÁà)лÀÜ#fÇDÃ(Íǂ`º#‹‰‚dº#ƒÄF PQ辏ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèõÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…xž#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ4…`ž#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿèW#ƒÄh¤Ü#jèš&ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qè^™ÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ +ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRH‹ +ìÛ#I‰ÐÁà)лÀÜ#fÇDÃ(͋E ‰‚`º#‹‰‚dº#ƒÄF PQè#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèZ›ÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…xž#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…`ž#‹JA‰J‹Z ƒûÿtG‹Ý`º#9È<)Á‰È‰BƒìB PSèƊ[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPDèÿÿƒÄƒìWjÿèW#ƒÄ‰ðPé¼‰öúèª<‹Ü#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ…`ž#‹JA‰J‹Z ƒûÿtG‹Ý`º#9È<)Á‰È‰BƒìB PSè&Š[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD荙ÿÿƒÄƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…xž#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…`ž#^‹^ ƒûÿts݉‹€`º#;F_¿`º#ÇEðv‹F+:‰FƒìF PS艍[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿèW#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹Ü#R‰ÑÁá)Ñf‰ÍÈÜ#‹E‹Õ)Ѝ4…`ž#^‹^ ƒûÿtr݉‹€`º#;F^¿`º#ÇEð‰ö‹F+:‰FƒìF PSè.ˆ[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿèW#ƒÄƒ}ðtèd—ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿dž#õ)óÁãǃ`ž#‰4;ǃhž#ƒì ƒlž#PèB‡ƒÃF‰;ƃhž#ƒÄ‰Æþÿ~±ÇXº#ÿÿÿÿÇ0¿#ƒìjhøž"è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…xž#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л`ž#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћ0¿#‰…tž#‹£0¿#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…xž#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…lž#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…xž#‹Õ)Ћ0¿#‰…tž#‹£0¿#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…xž#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸lž#ÿu ‹€hž#‰ë7‰öÇ‹Õ)Ћ…lž#¹ÈÜ#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹0¿#‰ƒúÿtnÕ)Ћ…tž#£0¿#‹Õ)л`ž#ǃ‹Õ)Љ …hž#ƒì ‹Õ)Ѝ…lž#P聄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…xž#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…`ž#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<ÕèÜ#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾èÜ#uAƒì‹Ýdº#Õ)Ѝ…lž#PS考‹†ÄÜ#ƒÄ‹… Ü#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=ôW#…ÚÇôW#¹»€¢%¾„¢%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh@¿#èÜýÿÿ¹ƒÄ¾ä¤%»à¤%‰ö‰ÁàQ‰0Ɖуù +véǧ%ÿÿÿÿƧ%Çؤ%¹¾D§%»@§%vÍ)ÈÁàQ‰0ƉуùvãÇpª%ÿÿÿÿÆlª%Ljª%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=ؤ%ÿuèí^ǍûÇEìÿÿÿÿ됡ؤ%€‹Õä¤%‰ؤ%û‰Eìƒ}ìÿu +¸ÿÿÿÿéìvƒì h@¿#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å ¢%t0ƒìÿu¿ōƒ€¢%Pè³EƒÄ…Àu€»˜¢%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ ¢%ƒìÿuƒ€¢%Pè÷D‹E쉃”¢%ƒÄ€}óu‰Â’‹] f‰Åè¤%ëv‹E썀‹E ¯Ef‰Õè¤%úƒì ‹U썒Áã·ƒè¤%Pèݨÿÿºì¤%‰ƒÄû…Àu%è”]ǒƒì h@¿#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾à¤%‹ƒì¤%‰‚ä¤%‰2ƒìjjƒü¤%Pè:ûÿÿƒÄ ·D3Pjƒ¥%Pè#ûÿÿƒÄ jjÃ¥%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=ˆª%ÿuèø\ǎûÇEèÿÿÿÿ롈ª%Å)‹•D§%‰ˆª%û‰Eèƒ}èÿu_ƒì h@¿#èvôÿÿ‹Eèéä‰öè§\ǐƒì h@¿#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h@¿#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹@§%ŠUòˆT P‹]ì‰
+‹] f‰\
+ǀD§%ÿÿÿÿ‰ºH§%‹]썛ÆÕà¤%ƍ¿ōr¿€¢%€|>t%ƒì¶D>Pšœ¢%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h@¿#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=ˆª%ÿuèa[ǎûÇEìÿÿÿÿë ¡ˆª%Å)‹•D§%‰ˆª%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàº@§%ˆ\ ‹M f‰LǀD§%ÿÿÿÿƒì h@¿#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å ¢%u ¿ÆEçë8ƒìÿu¶ŀ¢%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸀¢%ÆD ÆDƒìÿuPè>AƒÄ jjÃœ¢%Sè/øÿÿÇ$@¿#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº€¢%€|t'þDƒì h@¿#è®ñÿÿƒÄ jjƒœ¢%Pèûîÿÿ됃ì h@¿#è‹ñÿÿƒÄ¶‹<Ŕ¢%¿ŠUó:Åø¤%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·Åè¤%9E u€}ót(¿·Åè¤%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h@¿#è ìÿÿ¶‹Ť¢%ƒÄƒúÿ„­€}óu#è&YǕƒì h@¿#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…T§%9E t"èíXǔƒì h@¿#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »„¢%‹‰D§%‹Mì‰ ë/‰öèŸXǑƒì h@¿#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰Ť¢%ƒì h@¿#è*ðÿÿ‹EìÁà+EìÁàH‰±H§%º@§%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗@§%‰Uðh@¿#èÏêÿÿ‹Mð‹Y›ÁãC‰E躄¢%‹€Áà°à¤%ƀà¤%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹„¢%‹Eè‹ú ’¡Ø¤%‰Íä¤%‰ؤ%ûƇ@§%ƒÃ ‹Uð‹B‰ƒ„¢%ú¡ˆª%‰‡D§%‹Mì‰ +ˆª%ûƃ€¢%Ç$@¿#è
+ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…@§%‰Eð‹@€Åà¤%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…@§%‰Eð‹@€Åà¤%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìh0#è;ƒÄÿ5ؤ%h‹0#è;»ƒÄÝ)ØÁà€¸@§%t8@§%‹B€Åà¤%ƒì ÿp ÿp$‹B€ŀ¢%PShŸ0#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…P§%’Åà¤%ÿp ÿp$RQhÀ0#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h@¿#èHæÿÿ¿ÓÕ)Ѝ …‹X§%€Å ƒÄ€º€¢%u ‹D§%‰‚„¢%¿ÃÅ)ÂÁâƂ@§%ú‹ +ˆª%‰ŠD§%£ˆª%ûƒì h@¿#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…€Ü#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;ìÛ#u û¸#é~ƒ;ÿtc¾ÀÜ#‰ö‹ +ìÛ#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡ìÛ#‰CÿCè…ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡ìÛ#ÿD‡D¡ìÛ#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;ìÛ#tû¸髍vúè*'‹ìÛ# [‰ÊÁâ)Êf‰ÕÈÜ#‹E‹…€Ü#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅÝ#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h$1#è~ÿÿè +™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ€Ü#ƒÄ jh81#Sè"8fÇCÍÆCÇCÇC8¯"ÇC „¯"ÇC$¯"ÇC(˜¯"ÇC,ȯ"ÇC0ô¯"ÇC4<°"ÇC8œ¬"ÇC<„°"ÇC@„­"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…€Ü#ƒì h1#è7¾ƒÄƒÃƒìÿt³@h1#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…€Ü#ƒÀƒ|@tƒìRj
+èȽÿÿƒÄÉÍvU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+û¸ë"‰ö¡ìÛ#‹½€Ü#ƒÂÿD‚@¡ìÛ#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•€Ü#ú‹p¸…ö„V‹;ìÛ#u û¸#éA‹ìÛ#‹F ¿ÀÜ#;„“°v +¸é v¡ìÛ#‹Œƒ°‹“¬…Òt‰ö‹;ìÛ#…Š‹R…Òu븅À…†‹ +ìÛ#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡ìÛ#‰B‹ƒ¬ÿ@èj€ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…€Ü#¡ìÛ#ÿDƒD¡ìÛ#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½€Ü#ú‹X¸…Û„Ù‹;ìÛ#uû¸#éčv‹ìÛ#‹C ;„‘°s
+¸饡ìÛ#‹´°‹‘¬…Òt‰ö‹;ìÛ#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½€Ü#¡ìÛ#ÿDD¡ìÛ#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;ìÛ#tû¸éڍvúè&!‹ìÛ# [‰ÊÁâ)Êf‰ÕÈÜ#‹E‹…€Ü#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅÝ#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu +‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hd1#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4€Ü#ƒÄ jhx1#Vèî1fÇFÌÆFÇFÇF@¶"ÇF Ķ"ÇF$ð¶"ÇF( ·"ÇF,h·"ÇF0”·"ÇF4ì·"ÇF8ü°"ÇF<„²"ÇF@ˆ³"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…€Ü#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…€Ü#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…€Ü#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…€Ü#h1#è0»ƒÄwƒìÿtž@h1#èó/ƒÄCû™~ãƒì hB1#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h^1#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …€Ü#Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹…€Ü#ƒ|³DtƒìVj
+èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh‚1#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿@·%ÿt8CP‰Eä·8Ph‰1#èá-ƒÄ ÿt;·D;Ph—1#èÊ-ƒÄ ÿt; s·>Ph¨1#è±-ƒÄ ÿt>·D>Ph¹1#èš-ƒÄ ‹Uä·D:P·DLPhÊ1#è~-‹UèÕƒÄ·ØShÛ1#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh 2#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º :&fƒ= :&yA¿Áfƒ<Byfù™~îfù™~ƒì hð1#èÎ,¸ƒÄé ¿Á<¹ :&‰Úf Ê€f‰Ǎ<ÿÁçº@·%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇ¬·%¾`;&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹@·%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ :&]ÉöU‰åSƒì‹]¿E Ph2#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìh,Â"SèƒÄh¸»"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹øW#€82uºð°îƒìShb3#èˆ*ƒÄÁ㋃øW#@Ph½=#èp*ƒÄÿ³<X#ènƒÄ‹]üÉÉöU‰åƒìÿuhy3#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=„µ%„à…ÿ„Ø¡¬%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¬%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¬%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]衬%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=ô«%…Ρø«%€€€€€€‰ÃÁã‹ +ü«%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡ø«%‰¡ü«%éqvƒø…ç¶ä«%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +ð«%f)Ù·É +¬%º×®¬]‰È÷êÁú‰ÈÁø)¬%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£¬%f‰ð«%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¬%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹¬%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+‰ð™‰È)Ћ +¬%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=ô«%…rUè¡ø«%‰¡ü«%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ з𷀵%9Æv%h†3#j_h˜3#hŸ3#èm%Ç$èmƒÄ·€µ%)ó¯è«%·€µ%‰Ø‰Ñº÷ñ‰Ãº °
+îì©t‹ +è«%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡ø«%€€€€€€Áà‰Eä‹ +ü«%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ¤X#ƒ=¤X#uƒ=€X#tÿ€X#¶E÷€Áຬª%ƒ<uIÇö€°ª%tûƒì ¶]÷›Áã¾ ª%ÿ43ÿ“¤ª%ƒÄöDtú¶E÷€Ç…¬ª%ÿˆX#ƒ=¤X#uƒ=„X#tÿ„X#ÿ +¤X#eø[^]ÍvU‰åWVSº¿¬ª%¾¨ª%»¤ª%¹ ª%’ÁàÇ8‰0ÇÇBƒú~ÜǤX#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…¬ª%t÷Æu¸ÿÿÿÿëH’ …ǁ¬ª%û…Ût‰™¤ª%º ª%¨ª%‰‰t
+됍’Ç…¬ª%¸[^]ÐU‰å¡¤X#]ÉöU‰åSƒì¶ä«%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +ð«%f)Ù·É +¬%º×®¬]‰È÷êÁú‰ÈÁø)¬%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ +¬%f‰ð«%ÿ¤X#ƒ=¤X#uƒ=€X#tÿ€X#¡ü«%‰ÃD¿#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êø«%’’’’’’’’’Á⠉Ø)Уü«%‹à«%ë$‹¡ì«%‰‰ì«%‰à«%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;ø«%;ø«%uƋB;ü«%~»ƒ=¤X#uƒ=„X#tÿ„X#ÿ +¤X#‹]üÉÃU‰åWVSƒì‹uhˆÐ"j@èØ +ƒÄƒ>t,ƒì h¹3#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hÕ3#è³ ‹N‰ +è«%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ +€µ%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£ô«%ƒ=ä;&~»A¹C°p‰ÊÚîîÆä«%ë%Æä«%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ ¬%»$¬%ƒùbIÁà8¬%‰0I‰LÃAƒùc~ßÇhµ%Çì«% ¬%Ç€X#Ç„X#¡è«%€€€Áà£D¿#Çü«%Çø«%Ǭ%Ǭ%fÇð«%ƒ=ô«%uÇÄÛ#xÇ"ÇÈÛ#È"ëÇÄÛ#`È"ÇÈÛ#ìÎ"eô[^_]ÃU‰å‹E£€X#]ÍvU‰å‹E£„X#]ÍvU‰å‹E£X#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ì«%tl‹ +ì«%‹£ì«%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹à«%}è‹uè됋…Òt‰ð;B  +;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ +à«%‰‹AƒÄ [^_]ÐU‰å‹E¹‹à«%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+‹£à«%됋‰¡ì«%‰‰ì«%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ì«%„q‹5ì«%‹£ì«%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹à«%}è‹Mè됋…Ût‰È;C  +;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5à«%ƒ=„µ%…ôƒìEàPjè3óÿÿ‹à«%ƒÄ‹Eà;B  +;B u‹Eä;B~ÇEÜÇEØëK}؋à«%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡à«%‹@ +EàH‰EØ¡à«%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶ä«%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ð«%f)Ú·Ò‰Ö5¬%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +¬%‰AÁà)ȍÁ‰ÁÁá ȉò)‰¬%f‰ð«%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=à«%„/Ç„µ%‹à«%‹Eè;B ;B …Œ‹C;BŽ€ƒ=¤X#uƒ=€X#tÿ€X#ÿ¤X#‹à«%ë#‹¡ì«%‰‰ì«%‰à«%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè +;EèűB;Eì~ă=¤X#uƒ=„X#tÿ„X#ÿ +¤X#¶ä«%ƒøt"ƒø …Àt +ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ð«%f)Ú·Ò‰Ö5¬%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +¬%‰AÁà)ȍÁ‰ÁÁá ȉò)‰¬%f‰ð«%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹à«%‹Mè;J 
+;J u;B~ÇEäÇEàëJ]à‹à«%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡à«%‹@ +EèH‰Eà¡à«%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇ„µ%ë +‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹à«%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£à«%»ë‹‰¡ì«%‰‰ì«%ƒ=„µ%…ƒ=à«%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹à«%ƒÄ‹Eð;B  +;B u‹Eô;B~ÇEìÇEèëJ]è‹à«%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡à«%‹@ +EðH‰Eè¡à«%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼HÏ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º X#@£ŒX#1ÛfŒÓü¡ô«%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡”X#f9šX#t f£šX#ÿ-–X#ƒ=X#t‹X#ÿÓf©f¡ffaωöU‰å‹EØf£šX#f£”X#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;šX#t f£šX#ÿ-–X#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡XV#]ÉöU‰å]ÍvU‰åSƒì‹XV#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=JV#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèJV#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹`Y#fÇD
+8ƂeY#îƂdY#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+ X#ë7fƒùw<·Éƒé¸Óà
+¡X#¢¡X#º¡î<ÿu  X#©uƒÈ¢ X#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ" X#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"¡X#¢¡X#º¡î  X#©t%û¢ X#º!î]ÉöU‰å¿”X#]ÃU‰åƒì‹Ef£”X#˜PèWüÿÿƒÄÉÐU‰å¿”X#]ÃU‰åƒì‹E‰Âf£”X#ƒ=¤X#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹¬X#ºìX#‰öµÇ¨Ø"ǨØ"Fƒþ~åƒì EÈPèÅèºÇà;&!4#‹EÈ£ä;&¶¨X#£è;&ƒÄ‹EУð;&‹EÔ£ô;&‹EØ£ø;&hQÚ"jè£ýÿÿƒÄh[Ú"jè”ýÿÿƒÄheÚ"jè…ýÿÿƒÄhlÚ"jèvýÿÿƒÄhsÚ"jègýÿÿƒÄhzÚ"jèXýÿÿƒÄhÚ"jèIýÿÿƒÄhÇÚ"jè:ýÿÿƒÄhˆÚ"jè+ýÿÿƒÄhÚ"j èýÿÿƒÄh–Ú"j
+è +ýÿÿƒÄhÚ"j èþüÿÿƒÄh¤Ú"j èïüÿÿƒÄh«Ú"j +èàüÿÿƒÄh²Ú"jèÑüÿÿƒÄh¹Ú"jèÂüÿÿƒÄhÀÚ"jè³üÿÿƒÄh€Ù"jAè¤üÿÿƒÄhˆÙ"jBè•üÿÿƒÄhÙ"jCè†üÿÿƒÄh˜Ù"jDèwüÿÿƒÄh Ù"jEèhüÿÿƒÄh¨Ù"jFèYüÿÿƒÄh°Ù"jGèJüÿÿƒÄh¸Ù"jpè;üÿÿƒÄhÀÙ"jqè,üÿÿƒÄhÈÙ"jrèüÿÿƒÄhÐÙ"jsèüÿÿƒÄhØÙ"jtèÿûÿÿƒÄhàÙ"juèðûÿÿƒÄhèÙ"jvèáûÿÿƒÄhðÙ"jwèÒûÿÿf +T;&€¾ƒÄvÀÅ@·%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿`;&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=ä;&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•ìX#]ÉöU‰å‹U‹E ‰•¬X#]ÉöU‰åƒìh4#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƨX#Ûã¹âþfǪX#ZZÝ=ªX#¹âþf¡ªX#<u+Ù=ªX#¹âþf¡ªX#f%?fƒø?uƨX#ƨX#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë(`¸ ë `¸ ë`¸ +ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…¬X#ÿÓ[° ƒûrº îº îf¡”X#f;šX#t f£šX#ÿ-–X#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ëI¸ ëB¸ ë;¸ +ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=JV#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…ìX#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿,Y#È·À-yƒÀÁø9ÂtU¿,Y#@ÀÝ4Ŭ·%›È·À-yƒÀÁøf£,Y#¿5,Y#¿ <&4v4ö4õ¬·%¹üó¥Ý% <&^_]ÉöU‰å¿,Y#]ÃU‰åWVSƒì(ŠM¡0Y#Áà ˜€ f¶Ž<&f£JÏ#f¶<&f£LÏ#€ù t%€ù €ù„óé‰ö€ù
+„#é‰öfƒJÏ#·JÏ#;<&Œ½fÇJÏ#·LÏ#¡”<&H9Â…¿¡<&H‰Eì‰Uèf¾Œ<&Áâf‰Uò¡0Y#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯<&Èf‹]òf‰FA;Mì~çé)‰öfÇHÏ#·JÏ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰HÏ#f¡HÏ#f£JÏ#éævfÇJÏ#·LÏ#¡”<&H9Â…¾¡<&H‰Eà‰UÜf¾Œ<&Áâf‰Uæ¡0Y#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯<&Èf‹]æf‰FA;Mà~çé%‰öfÿ +JÏ#·JÏ#·LÏ#¯<&ÂÆS fÿJÏ#éõ‰ö·JÏ#·LÏ#¯<&Ј CfÿJÏ#·JÏ#;<&Ž¿fÇJÏ#·LÏ#¡”<&H9Â…š¡<&H‰EԉUÐf¾Œ<&Áâf‰UÚ¡0Y#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯<&Èf‹]Úf‰FA;MÔ~çëfÿLÏ#·5JÏ#·=LÏ#‰øf¯<&f‰EΡ0Y#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆŽ<&‰ø¢<&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯<&f‰Eò¡0Y#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢Ž<&‰úˆ<&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡0Y#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯<&È·G‰ð¯<&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯<&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡<&H‰Eð‹”<&K‰]ìf¾Œ<&Áàf‰Eê¡0Y#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯<&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰<&¶„@£”<&¶„ÿ ¢Œ<&¶P¢Ž<&¶Q¢<&¶`¢OÏ#¶a¢NÏ#Ç4Y#Ç0Y#]ÃU‰åWVSƒì Ž<&¢P <&¢Q¶ÀP¶Ž<&PèŠýÿÿ¶NÏ#¶5OÏ#ƒÄ¹Ô°
+‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £4Y#¹Ô° +‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹0Y#Áâ»`Ï#¶Ž<&‰¹€Ï#¶<&‰
+µŠ¢Ž<&Š
+¢<&‰50Y#[^]ÃU‰å¡4Y#]ÉöU‰å¡0Y#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯<&¡0Y#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢<&ŠE¢Ž<&ƒÄeô[^_]ÍvU‰åWVSƒì ¡<&H‰Eð‹=”<&Of¾Œ<&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯<&¡0Y#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿƍ<&ÆŽ<&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯<&¡0Y#Áà ÂU”€ ˆ
+ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯<&¡0Y#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯<&¡0Y#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh<4#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh Ï#èX‰ÃÇ$ Ï#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh Ñ#謉ÃÇ$ Ñ#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë +¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$… %#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë +vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäj
+VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} +ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…ð&#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$…@(#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhH4#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhU4#Wè¶öÿÿ‰ÇƒÄ EìPj
+됃ìh`4#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä +ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhx4#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} +‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì Sè1 +ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(Ý€)#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý€)#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ€)#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý€)#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý€)#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E 8Y#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEä݈)#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHݘ4#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾݘ4#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5)#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ 4#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿܨ4#Ü +)#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèݘ)#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?ݘ4#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙݘ4#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf +? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh°4#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh´4#Qè çÿÿƒÄ¸ë‰ö…Étƒìh¹4#QèçÿÿƒÄ¸ÉÃU‰åƒì¸ Ó#ƒ=DY#tÿDY#ÉÃU‰å‹E£DY#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=HY#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•°)#ÝØÇEغ¾4#ƒøc~ºÃ4#‰UÜÇEðÇEôƒ=HY#„}ƒì EØP誃ąÀ…uƒ=HY#…YƒìjhÉ4#éëvÝØÇEغÝ4#ƒøc~ºâ4#‰UÜÇEðÇEôƒ=HY#„ƒì EØPè>ƒÄ…À… ƒ=HY#…íƒìjhè4#év‰]à‰uäÝ]èÇEغü4#ƒøc~º5#‰UÜÇEðÇEôƒ=HY#„žƒì EØPè˃ąÀ…–ƒ=HY#…zƒìjh 5#é ÝØÇEغ5#ƒøc~º$5#‰U܃=HY#uÇEðàÇEôÿÿïGé¸ +¡<Y#‹@Y#‰Eð‰Uôé¡ +‰öÝØÇEغ²6#ƒøc~º¸6#‰U܃=HY#uÇEðàÇEôÿÿïGéh +¡<Y#‹@Y#‰Eð‰UôéQ +‰öÝØÇEغ+5#ƒøc~º/5#‰U܃=HY#uÇEðàÇEôÿÿïGé +¡<Y#‹@Y#‰Eð‰Uôé +‰öÝØÇEغ+5#ƒøc~º/5#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ·/#ƒøc~º45#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„óƒì EØPè ƒÄ…À…ëƒ=HY#…σìjh85#éaÝØÇEغ·/#ƒøc~º45#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„gƒì EØP蔃ąÀ…_ƒ=HY#…Cƒìjh85#éÕ +ÝØÇEغx/#ƒøc~ºJ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„Û +ƒì EØPèƒÄ…À…Ó +ƒ=HY#…· +ƒìjhN5#éI +ÝØÇEغx/#ƒøc~ºJ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„O +ƒì EØPè| +ƒÄ…À…G +ƒ=HY#…+ +ƒìjhN5#é½ ÝØÇEغ`5#ƒøc~ºc5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„à ƒì EØPèð ƒÄ…À…» ƒ=HY#…Ÿ ƒìjhg5#é1 ÝØÇEغ`5#ƒøc~ºc5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„7 ƒì EØPèd ƒÄ…À…/ ƒ=HY#… ƒìjhg5#é¥ ÝØÇEغy5#ƒøc~º€5#‰U܃=HY#uÇEðàÇEôÿÿïGéP ¡<Y#‹@Y#‰Eð‰Uôé9 ‰öÝØÇEغy5#ƒøc~º€5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=HY#…= ƒìjhˆ5#éÏ
+vÝØÇEغœ5#ƒøc~º 5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=HY#…¯
+ƒìjh¥5#éA
+ÝØÇEغœ5#ƒøc~º 5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=HY#…#
+ƒìjh¶5#éµ ÝØÇEغÉ5#ƒøc~ºÏ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„Íƒì EØPèè ƒÄ…À…³ ƒ=HY#…— ƒìjhÖ5#é) ÝØÇEغÉ5#ƒøc~ºÏ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„/ ƒì EØPè\ ƒÄ…À…' ƒ=HY#… ƒìjhé5#靐ÝØÇEغþ5#ƒøc~º6#‰UÜÇEðÇEôƒ=HY#… ƒì EØPèòƒÄ…À…½ƒìjh6#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغþ5#ƒøc~º6#‰U܃=HY#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ +h7#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡<Y#‹@Y#‰Eð‰Uô‰]ЉuÔÝEÐÜ +h7#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡<Y#‹@Y#ò€‰Eð‰UôéòvÝØÇEغþ5#ƒøc~º6#‰UÜÇEðÇEôéÁ‰öÝØÇEغþ5#ƒøc~º6#‰U܃=HY#uÇEðÇEôë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„ãƒì EØPèƒÄ…À…Ûƒ=HY#…¿ƒìjh6#éQÝØÇEغþ5#ƒøc~º6#‰U܃=HY#uÇEðÇEôëÇEðÇEôøƒ=HY#„`ƒì EØP荃ąÀ…Xƒ=HY#…<ƒìj h@7#éΉöÇEغ96#ƒøc~º>6#‰U܃=HY#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ +<Y#‹@Y#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغD6#ƒøc~ºI6#‰U܃=HY#uÇEðÇEôëÇEðÇEôøƒ=HY#„Lƒì EØPèyƒÄ…À…Dƒ=HY#…(ƒìjhO6#麉öÇEغc6#ƒøc~ºh6#‰U܃=HY#uÝ]ðëÝØÇEðÇEôøƒ=HY#„Òƒì EØPèÿƒÄ…À…ʃ=HY#…®ƒìjhn6#é@ÝØÇEغƒ6#ƒøc~º6#‰UÜÇEðÇEôøƒ=HY#„iƒì EØP薃ąÀ…aƒ=HY#…Eƒìjh˜6#é׍vÝØÇEغ±6#ƒøc~º·6#‰UÜÇEðÇEôøƒ=HY#„ýƒì EØPè*ƒÄ…À…õƒ=HY#…Ùƒìjh¾6#ékvÝØÇEغÓ6#ƒøc~ºÙ6#‰UÜÇEðÇEôøƒ=HY#„‘ƒì EØP较ąÀ…‰ƒ=HY#…mƒìjhà6#éÿvÇEغÓ6#ƒøc~ºÙ6#‰UÜÜ5p7#Ý]ðƒ=HY#„,ƒì EØPèYƒÄ…À…$ƒ=HY#…ƒìjhõ6#隉öÇEغ7#ƒøc~º7#‰U܋ +<Y#‹@Y#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغ7#ƒøc~º7#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=HY#…jé|vÝØÇEغ7#ƒøcŽ•º7#鋍vÝØÇEغ·/#ƒøc~uº45#ën‰öÝØÇEغ+7#ƒøc~Yº.7#ëR‰öÝØÇEغx/#ƒøc~=ºJ5#ë6‰öÝØÇEغ27#ƒøc~!º57#ë‰öÝØÇEغ`5#ƒøc~ºc5#‰UÜÇEðÇEôƒ=HY#„¯ƒì EØPèʃąÀ…•ƒ=HY#…‹ƒìjÿuÜjè«îÿÿƒÄ jh7#jèšîÿÿƒÄëfÝØÇEغz5#ƒøc~º5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغz5#ƒøc~º5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#„‰ƒì EØP趃Ä…À…ƒ=HY#uiƒìjh‰5#jè™íÿÿƒÄëSÇEغþ5#ƒøc~º6#‰UÜÝ]ðƒ=HY#ÿt ƒ=HY#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhx7#h‚7#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hx7#h7#è` ƒÄöCtƒìjahx7#hÀ7#èC ƒÄöC tƒìjbhx7#h8#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhx7#h¡7#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh08#h;8#èX ƒÄ‹F ;Cv‹F;C sƒìjmh08#h`8#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh8#h•8#èÙ
+ƒÄ…ÿuƒìjMh8#hž8#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh8#hà8#è€
+ƒÄƒ~t‹F;F rƒìjUh8#h@9#è[
+ƒÄ‹F +F9FvƒìjUh8#h€9#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h8#hÀ9#èø ƒÄöCtƒìj_h8#h:#èÛ ƒÄƒ;t9wƒìj`h8#h@:#è» ƒÄ;^ rƒìjah8#h¶8#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwh8#hÍ8#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThi:#h•8#èۃă} uƒìjUhi:#hž8#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hi:#hà8#舃ăt‹G;G rƒìj[hi:#h@9#ècƒÄ‹G +G9Gvƒìj[hi:#h€9#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkhi:#hÀ9#èèƒÄöCtƒìjlhi:#h:#è˃ă;t9wƒìjmhi:#h@:#諃Ä;_ rƒìjnhi:#h¶8#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hi:#ht:#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hi:#h :#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´hi:#hÍ8#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShÒ:#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh`;#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjahä:#hà8#袃ă~t‹F;F rƒìjahä:#h@9#è}ƒÄ‹F +F9Fvƒìjahä:#h€9#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh ;#è—ËÿÿƒÄ ÷Ãtƒìjihä:#hÀ9#èƒÄöCtƒìjjhä:#hà;#èóƒÄƒ{wƒìjkhä:#hë:#èփă;t9wƒìjlhä:#h@:#趃Ä;^ rƒìjmhä:#h¶8#蚃Ä{‹…Û…BÿÿÿƒìWh;#èäÊÿÿƒÄ9~tƒìjshä:#h;#è`ƒÄ‹6…ö…cþÿÿƒì h2;#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh{7#h•8#è ƒÄ…ÛuƒìjOh{7#h<#èñƒÄƒ}uƒìjPh{7#hž8#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh{7#h<#螃ă{uƒ{t‹C;CsƒìjYh{7#hà8#èsƒÄƒ{t‹C;C rƒìjYh{7#h@9#èNƒÄ‹C +C9CvƒìjYh{7#h€9#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh{7#h€9#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh{7#h@<#諃ąöt8‹U:9ðr.9ðtƒìjuh{7#h€<#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h¦<#hà8#蠃ă~t‹F;F rƒìj]h¦<#h@9#è{ƒÄ‹F +F9Fvƒìj]h¦<#h€9#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh¦<#hÀ9#è$ƒÄöCtƒìjeh¦<#hà;#èƒÄƒ{wƒìjfh¦<#hë:#èêƒÄƒ;t9wƒìjgh¦<#h@:#èʃÄ;^ rƒìjhh¦<#h¶8#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh¦<#h;#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuhÀ<#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuhÀÓ#è…ÈÿÿƒÄhÀÓ#ÿ5Ü#jSVh@=#è5ƒÄ eø[^]ÍvU‰åƒìÿ5ìÛ#jÿuÿu ÿuh=#èƒÄ ÉÉöU‰åƒì E PÿuhÀ×#èÈÿÿƒÄ jjhx #èì%ÿÿƒÄhÀ×#h£=#èŠÅÿÿÇ$MèFÿÿƒÄÉÐU‰åƒìhÀ×#h€=#ècÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лÄÜ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»ÈÜ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰ÅÝ#ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹˜ß#‰U苀œß#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;՘ß#|[‰Eäv1‰ÐÁà)ЍÅ;š˜ß#u ‹Eì;‚œß#|1‰Ï‰ÐÁà)Ћ ÅÝ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Řß#}«ƒÿÿt‰ÐÁà)ЋU‰ÅÝ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜ÌÜ#¿ÈÜ#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»ÌÜ#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹ÕÝ#‰ƒøÿt@‰ÐÁà)ÐÇÅÝ#ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰ÅÝ#‹@‰ÂÁâ)‰ ÕÝ#됉KI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰ÅÝ#‹C@‰ÂÁâ)‰ ÕÝ#ë‰ö‰ I‰ÐÁà)ÐÇÅÝ#ÿÿÿÿI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸Á=#됸Æ=#됸Ê=#됸Ð=#됸‘.#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèL—ÿÿƒÄ ÿuìÿuèhà=#èeÁÿÿƒÄ÷EtN¾;5ðÛ#sA¿ Ü#vƒì µ‹;¶BP·BPRVh >#è!ÁÿÿƒÄ‹;VÿP ƒÄF;5ðÛ#rÇ÷Etƒì hû=#èõÀÿÿèX&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éö(é"ðë"ðë"ðë"ðë"ðë"\ë"ðë"hë"të"ðë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"4é"Hé"´ê"tê"ôê"Pë"Hé"ðë"ðë"Dë"ðë"Pë"ðë",ê"ðë"ðë"Lê"ðë"”é"ðë"ðë"àé"Ôì"´î"´î"´î"´î"´î",î"´î"8î"@î"´î"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"àì"ôì"´î"´î"´î" î"ôì"´î"´î"î"´î" î"´î"´î"´î"´î"ìí"´î"Dí"´î"´î"ˆí"Àñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"ï"ï"ï"ï"ï"ï"ï"ï"ï"ï"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Àï"Dð"@ñ"@ñ"@ñ"´ñ"Dð"Ìñ"Ìñ"¨ñ"Ìñ"´ñ"Ìñ"Ìñ"Ìñ"Ìñ"Øï"Ìñ"´ð"Ìñ"Ìñ"Ðð"$@$@$##ü#l#¼# #\#Œ##¤#0#¼#H#Ô#$#¬#8#Ä#P #Ü #P
+#l #œ #( #¬ #< +#À +#8#¤##|#à#,#p#”#°#Ì#è##„#ü#„#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#$##ü#l#¼# #\#Œ##¤#0#¼#H#Ô#$#¬#8#Ä#P #Ü #P
+#l #œ #( #¬ #< +#À +#8#¤##|#à#,#p#”#°#Ì#è##„#ü#„#SIGNAL HANDLER: pid=%d
+main: ending...
+main: alarm(5), waiting t=2 sec
+main: alarm(3) return %d, waiting t=6 sec
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ +Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+8Œÿÿ’ÏÿÿšÏÿHN#ÿ`Y#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#hV#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-.#&.#.#.#.#
+.#.#ü-#hy"py"py"S3#F3#83#'3# 3#ö2#æ2#Ò2#Ã2#³2#¦2#‘2#€2#f2#Z2#³2#G2#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš‡4#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€%! %# &¨ )HN#È> /LY#àI5`Y#àI8ã :àILC,[h”aI
\ No newline at end of file
/branches/pj/pse51/ptest5
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest4.c
===================================================================
--- branches/pj/pse51/ptest4.c (nonexistent)
+++ branches/pj/pse51/ptest4.c (revision 1085)
@@ -0,0 +1,151 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest4.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 4:
+
+ the main task create 3 tasks, J1, J2, J3
+ at t = 1 sec. it raise a signal to J1
+ at t = 2 sec. it kills J2
+
+ J1,J2,J3: it simply calls nanosleep
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <signal.h>
+#include <time.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+void uscitaJ(void *arg)
+{
+ cprintf("J: (pid=%d) AAAARRRRGGGHHH!!! killed by someone...\n", exec_shadow);
+}
+
+void *J(void *arg)
+{
+ struct timespec t1, t2;
+ int err;
+
+ cprintf("J (pid=%d) starts and call nanosleep\n",exec_shadow);
+
+ t1.tv_sec = 3;
+ t1.tv_nsec = 0;
+ NULL_TIMESPEC(&t2);
+ pthread_cleanup_push(uscitaJ,NULL);
+ err = nanosleep(&t1, &t2);
+ pthread_cleanup_pop(0);
+
+ cprintf("J (pid=%d) ending, nanosleep returns errno=%d, t2=%ld.%ld\n",
+ exec_shadow, err, t2.tv_sec, t2.tv_nsec/1000);
+
+ return 0;
+}
+
+void signal_handler(int signo, siginfo_t *info, void *extra)
+{
+ cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ int err;
+ pthread_t j1, j2, j3;
+ struct sigaction sig_act;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ sig_act.sa_sigaction = (void *) signal_handler;
+ sig_act.sa_flags = SA_SIGINFO;
+ sigemptyset(&sig_act.sa_mask);
+
+ sigaction(31, &sig_act, NULL);
+
+ cprintf("main: creating J1\n");
+ err = pthread_create(&j1, NULL, J, NULL);
+ if (err) cprintf("Error creating J1\n");
+
+ cprintf("main: creating J2\n");
+ err = pthread_create(&j2, NULL, J, NULL);
+ if (err) cprintf("Error creating J2\n");
+
+ cprintf("main: creating J3\n");
+ err = pthread_create(&j3, NULL, J, NULL);
+ if (err) cprintf("Error creating J3\n");
+
+ cprintf("main: waiting 1 sec\n");
+ while (sys_gettime(NULL) < 1000000);
+
+ cprintf("main: pthread_kill on j1, then wait until t=2 sec \n");
+ pthread_kill(j1, 31);
+
+ while (sys_gettime(NULL) < 2000000);
+ cprintf("main: pthread_cancel(J2)\n");
+ pthread_cancel(j2);
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/pinit.c
===================================================================
--- branches/pj/pse51/pinit.c (nonexistent)
+++ branches/pj/pse51/pinit.c (revision 1085)
@@ -0,0 +1,126 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: pinit.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ This is a minimal initialization file for the PSE51 profile.
+
+ It initializes the POSIX scheduler, the Hartik Ports and the Keyboard driver.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "modules/posix.h"
+#include "modules/dummy.h"
+
+#include "modules/pi.h"
+#include "modules/pc.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+
+#include "drivers/keyb.h"
+
+#include "pthread.h"
+#include "time.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ POSIX_register_level(RRTICK, POSIX_MAIN_YES, mb, 32);
+ dummy_register_level();
+
+ PI_register_module();
+ PC_register_module();
+
+ SEM_register_module();
+
+ /* for the Pthread library */
+ PTHREAD_register_module(1, 0, 1);
+
+ /* for the real time clock extensions */
+ TIMER_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ NRT_TASK_MODEL m; // the scheduling model for the Keyboard
+
+ KEYB_PARMS k = BASE_KEYB;
+ keyb_def_task(k, &m);
+
+ nrt_task_default_model(m);
+ nrt_task_def_arg(m,arg);
+ nrt_task_def_usemath(m);
+ nrt_task_def_ctrl_jet(m);
+ nrt_task_def_save_arrivals(m);
+ nrt_task_def_unjoinable(m);
+ nrt_task_def_weight(m, sched_get_priority_max(SCHED_RR));
+ nrt_task_def_policy(m,SCHED_RR);
+ nrt_task_def_inherit(m,PTHREAD_EXPLICIT_SCHED);
+ nrt_task_def_nokill(m);
+ nrt_task_def_system(m);
+
+ HARTPORT_init();
+
+ if (KEYB_init(&k) < 0)
+ kern_printf("Error during Keyboard Initialization!!!");
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
Index: branches/pj/pse51/ptest5.c
===================================================================
--- branches/pj/pse51/ptest5.c (nonexistent)
+++ branches/pj/pse51/ptest5.c (revision 1085)
@@ -0,0 +1,109 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest5.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 5:
+ an alarm test
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+
+
+void signal_handler(int signo, siginfo_t *info, void *extra)
+{
+ cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ struct sigaction sig_act;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ sig_act.sa_sigaction = (void *) signal_handler;
+ sig_act.sa_flags = SA_SIGINFO;
+ sigemptyset(&sig_act.sa_mask);
+
+ sigaction(SIGALRM, &sig_act, NULL);
+
+ cprintf("main: alarm(5), waiting t=2 sec\n");
+ alarm(5);
+
+ while (sys_gettime(NULL) < 2000000);
+
+ cprintf("main: alarm(3) return %d, waiting t=6 sec\n",alarm(3));
+
+ pause();
+// while (sys_gettime(NULL) < 6000000);
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/ptest6
===================================================================
--- branches/pj/pse51/ptest6 (nonexistent)
+++ branches/pj/pse51/ptest6 (revision 1085)
@@ -0,0 +1,527 @@
+ELF"4(4 ( €""H[H[ È[Hk#Hk# ðõ 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸”#fe£hk#Áèfe£nk#Hs#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼`ž#ÇÐÛ%`~#ÇÔÛ%`ž#£Ts#‰Xs#Hs#êµ"8Ns#üè¢íê U‰å‹Eê ‰öU‰åSìŒÿuh€D#èAE„Pjd]ˆSÿ5L$èœ]ƒÄ Sÿu„PhÀD#èƒÄh,$ÿ5L$è_aƒÄ…Àtƒì謃Äÿ0h E#èéèÀAƒÄƒì h…H#èԃĐƒì jèòAƒÄ=?Bvìƒì h@E#è¯jj +hH#ÿ5L$è;XƒÄ …Àtƒìè@ƒÄÿ0hªH#è}èTAƒÄjhø"jhH$èêcjhä"jh$$è×cƒÄhÈH#èBƒÄ‹]üÉÉöU‰åSìh×H#è$E„Pjd]ˆSÿ5L$è\ƒÄ Sÿu„Ph E#èýÿÇ$ñH#èñÿƒÄ‰öƒì jèAƒÄ=_ãvìƒì hàE#èËÿjjh I#ÿ5L$èWWƒÄ …Àtƒìè\ƒÄÿ0h F#è™ÿèp@ƒÄƒì hI#è„ÿjjhI#ÿ5L$èWƒÄ …ÀtƒìèƒÄÿ0h@F#èRÿè)@ƒÄƒì hI#è=ÿjjhI#ÿ5L$èÉVƒÄ …Àtƒìè΃Äÿ0h`F#è ÿèâ?ƒÄƒì hI#èöþjj h I#ÿ5L$è‚VƒÄ …Àtƒì臃Äÿ0h€F#èÄþè›?ƒÄƒì hI#è¯þjjh,I#ÿ5L$è;VƒÄ …Àtƒìè@ƒÄÿ0h F#è}þèT?ƒÄƒì hI#èhþÇ$;I#è\þ¸ƒÄ‹]üÉÍvU‰åVSìœhJI#è7þƒÄƒì jèV?ƒÄ=¿‘!v썅tÿÿÿPjd]ˆSÿ5L$èxZSÿµtÿÿÿPhG#èöýƒÄ vƒì jè?ƒÄ=ÿž$v썅tÿÿÿPjd]ˆSÿ5L$è4ZSÿµtÿÿÿPhG#è²ýƒÄ vƒì jèÎ>ƒÄ=?¬'v썅tÿÿÿPjd]ˆSÿ5L$èðYSÿµtÿÿÿPhG#ènýƒÄ vƒì jèŠ>ƒÄ=¹*v썅tÿÿÿPjd]ˆSÿ5L$è¬YSÿµtÿÿÿPhG#è*ýƒÄ vƒì jèF>ƒÄ=¿Æ-v썅tÿÿÿPjduˆVÿ5L$èhYVÿµtÿÿÿPhG#èæüDžxÿÿÿè"Dž|ÿÿÿƒÄjè8@‰Ã‹‰E€…xÿÿÿ‰…tÿÿÿPjdVÿ5L$èYƒÄ VÿµtÿÿÿPhG#èü‹E€‰ƒÄ¸eø[^]ÍvU‰åSƒì<ÆEÉxÆEÊ-ÆEÈh@"ƒì‹EÈf‰$ÆD$-è˜ÇEô"ÇEð]èEì‰$輁ƒÄ jSjè§lÇ,$Ç0$Ç4$+ÇT$Ç\$ Ç`$Ø"Çd$$ƒÄÇ$Ç $Ç$Ç$Ç $Ç$ÇD$
+Ç$
+ÇEØÇEÜÇEàdEØPjjBhpI#è»K£L$ƒÄƒøÿuƒìèƒÄÿ0h€G#錍vƒìhT$ÿ5L$è[ƒÄ…Àtƒìè΃Äÿ0h G#ë[‰öƒì hàG#èÿújh"jhP$èt^ƒÄh H#èßúƒÄƒì jèþ;ƒÄ=ßg5vìƒì ÿ5$$èö_Ç$sI#è®ú¸ƒÄ‹]üÉÐU‰åƒìh`D#èújj hLH#ÿ5L$èRƒÄ …Àtƒìè!ƒÄÿ0hXH#ë ƒì hvH#èSú¸ƒÄÉÐU‰åƒìhÀF#è8úƒÄÉÍvU‰åSƒì‹] jèK;ƒÄPÿs ÿs¸dI#ƒ{t¸jI#Pÿ3h@G#èøùƒÄ ‹]üÉÃU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èý”è°žè7ÂèfÈèá®ƒÄ jjjèÃ^螌¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾\s#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjèü]‰EÐÇEÜÇEàƒMÌ
+膲E¨‰$ècƒÄ…Àyƒì h I#èkùƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=lt#„¶€ú*t€úªt
+€ú6t€ú¶uÆlt#¸é›„Òy,Ælt#€ú¸uÆxt#Ænt#ëՀúuÐÆxt#ëljöÆlt#€ú8u€ +xt#Ænt#멀úu € +xt#뛉ö€ú5uf¾Ÿ#·Àé)v€ú…•f¾üž#·Àé +v€úàuÆlt#éTÿÿÿv€ú*t€ú6u2Æmt#€ú*u€ +xt#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ +xt# éÿÿÿv€úªt€ú¶u"Æmt#€úªt €ú¶…öþÿÿÆxt#éêþÿÿ€úFu€=qt#•qt#ë.v€ú:u€=ot#•ot#ëv€úEu;€=pt#•pt#ƒì¶qt#P¶ot#P¶pt#Pèõ¸ƒÄé€úu€ +xt#éhþÿÿv€ú8u€ +xt#éTþÿÿv€út€ú¸uÆxt#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
+€úHt€úIu€=pt#uT€=mt#uK·Â +ÿë~€=ot#t/Bð< vBâ<vBÔ<w€=mt#t¶Âf¾€àž#·ÀëG€=mt#t¶Âf¾€€Ÿ#·Àë-v€=nt#t¶Âf¾€  #·Àëv¶Âf¾€àž#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  xt#ƒÈ@ë‰ö xt#ˆE؈UيE׈EÚ±»;؞#}8¾`ž#v݊D2:EÚuŠ2:EØuƒì Wÿ’dž#±ƒÄC;؞#|ЄÉuƒìjW¿¢ #Pè­·ƒÄè-é<ÿÿÿU‰å‹E£ht#Šˆâž#ŠPˆãž#ŠPˆäž#ŠPˆåž#ŠPˆæž#ŠPˆçž#ŠPˆèž#ŠPˆéž#ŠPˆêž#ŠP ˆëž#ŠP
+ˆ‚Ÿ#ŠP ˆƒŸ#ŠP ˆ„Ÿ#ŠP +ˆ…Ÿ#ŠPˆ†Ÿ#ŠPˆ‡Ÿ#ŠPˆˆŸ#ŠPˆ‰Ÿ#ŠPˆŠŸ#ŠPˆ‹Ÿ#ŠPˆìž#ŠPˆŒŸ#ŠPˆíž#ŠPˆŸ#ŠPˆúž#ŠPˆšŸ#ŠPˆûž#ŠPˆ›Ÿ#ŠPˆŸ#ŠPˆ§Ÿ#ŠPˆŸ#ŠPˆ¨Ÿ#ŠP ˆ Ÿ#ŠP!ˆ©Ÿ#ŠP"ˆŸ#ŠP#ˆµŸ#ŠP$ˆŸ#ŠP%ˆ³Ÿ#ŠP&ˆŸ#ŠP'ˆ´Ÿ#ŠP(ˆ Ÿ#ŠP)ˆ«Ÿ#ŠP*ˆŸ#ŠP+ˆ¹Ÿ#ŠP,ˆîž#ŠP-ˆŽŸ#ŠP.ˆïž#ŠÖˆŸ#ŠP0ˆáž#ŠP1ˆŸ#ŠP2ˆüž#ŠP3ˆœŸ#ŠP4ˆäŸ#ŠP5ˆϟ#ŠP6ˆП#ŠP7ˆџ#ŠP8ˆ˟#ŠP9ˆ̟#ŠP:ˆ͟#ŠP;ˆǟ#ŠP<ˆȟ#ŠP=ˆɟ#ŠP>ˆҟ#ŠP?ˆӟ#ŠP@ˆ.Ÿ#ŠPAˆŸ#ŠPBˆŸ#ŠPCˆ*Ÿ#ŠPDˆΟ#ŠPEˆ·Ÿ#ŠPFˆʟ#ŠPGˆþž#ŠPHˆžŸ#ŠPIˆŸ#ŠPJˆ°Ÿ#ŠPKˆŸ#ŠPLˆ®Ÿ#ŠPMˆŸ#ŠPNˆ Ÿ#ŠPOˆòž#ŠPPˆ’Ÿ#ŠPQˆŸ#ŠPRˆ¡Ÿ#ŠPSˆŸ#ŠPTˆ¢Ÿ#ŠPUˆŸ#ŠPVˆ£Ÿ#ŠPWˆ÷ž#ŠPXˆ—Ÿ#ŠPYˆŸ#ŠPZˆ¤Ÿ#ŠP[ˆŸ#ŠPRˆ¥Ÿ#ŠP]ˆŸ#ŠP^ˆ¦Ÿ#ŠP_ˆŸ#ŠP`ˆ²Ÿ#ŠPaˆŸ#ŠPbˆ±Ÿ#ŠPcˆøž#ŠPdˆ˜Ÿ#ŠPeˆùž#ŠPfˆ™Ÿ#ŠPgˆðž#ŠPhˆŸ#ŠPiˆóž#ŠPjˆ“Ÿ#ŠPkˆÿž#ŠPlˆŸŸ#ŠPmˆôž#ŠPnˆ”Ÿ#ŠPoˆöž#ŠPpˆ–Ÿ#ŠPqˆŸ#ŠPrˆ¯Ÿ#ŠPsˆñž#ŠPtˆ‘Ÿ#ŠPuˆ +Ÿ#ŠPvˆ­Ÿ#ŠPwˆõž#ŠPxˆ•Ÿ#ŠPyˆ Ÿ#ŠPzˆ¬Ÿ#ŠP{ˆ: #ŠP|ˆ; #ŠP}ˆG #Š@~¢H #]ÍvU‰åWVSƒì\‹]}ؾ€t#ü¹󥿸ƒ=tt#…Qº¾àž#¹€Ÿ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇChs#ƒì ÿsèûÿÿÇ$jjjhÙI#èªf£¢ #ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhÙI#èà­f£¤ #ƒÄfƒøÿuƒì ¿¢ #PèE±¸ýÿÿÿ頍vÇ؞#ƒ{ÿuÇC0"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
+ÇE̍E¨ë‹ƒì jjPh8 "hâI#èÿ‰ÃƒÄ ‰¨ #ƒøÿu'ƒì ¿¢ #PèC°¿¤ #‰$è4°‰Ø钐ƒ=|t#uWƒì ÿ5¨ #艉ǃąÿt4ƒì ¿¢ #Pèü¯¿¤ #‰$èí¯ƒÄÿ5¨ #èg5¸üÿÿÿë=Ç|t#ëèƒì¶qt#P¶ot#P¶pt#PèûÇtt#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿¤ #PèృÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿¤ #P襱·ÀƒÄÉÐU‰åSƒ=؞#0‹ +؞#Í»`ž#‹Ef‰ŠE
+ˆD‹E ‰‚dž#A‰ +؞#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=tt#t9蓃ì ÿ5¨ #è-4¿¢ #‰$薮¿¤ #‰$臮¸ƒÄÉÐU‰åƒìjèêÇ$èÛéÇ$ÈI#è£éè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
+¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t +‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t +‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
+¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆŒt#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ƌt#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=Œt#„þÆŒt#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆŒt#¸eô[^_]ÃU‰åVS¡ t#…Àt¡ t#H£ t#¸é²¸ë6ƒ=˜t#uKŠœt#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜t#뤍v¸ë:ƒ=˜t#uGǘt#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡¤t#@£¤t#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆt#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=Œt#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡¤t#@£¤t#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë +¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîƍt#¸eô[^_]ÍvU‰åƒìÇÄ¡#ÇÀ¡#ƒ=”t#t!úè‹õÿÿ£t#Ç”t#û…Àtúèôÿÿû¡t#…Àuƒìÿuh'"jèÅf¸ƒÄÉÍvU‰åVS¡ t#@£ t#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ t#@£ t#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë +¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡À¡#@%ÿ£À¡#Š€À #ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=¬t#t(Ç$¢#Ç ¢#Ç(¢#Ǭt#‹E£¨t#ƒ=”t#t!úèôÿÿ£t#Ç”t#û…Àtúèòÿÿû¡t#…Àu.¸ìÿÿÿ€=Œt#t ƒìjÿhX'"j è/eƍt#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ ¢#@ƒà?£ ¢#ºà¡#ŠˆA¡ ¢#@ƒà?£ ¢#Šˆ¡ ¢#@ƒà?£ ¢#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=t#tèäùÿÿƒì j è>eƍt#¸ƒÄÉÐU‰åƒìƒ=”t#t!úè óÿÿ£t#Ç”t#û…Àtúè™ñÿÿû¡t#…Àt¸ë¶Œt#ÉÍvU‰åVSŠEŠU€} t ƒ +œt#ë ‰öƒ%œt#„Àt ƒ +œt#ëƒ%œt#„Òtƒ +œt#ë¸ë6¸ëbƒ%œt#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜t#[^]ÐU‰åSƒìœúX‰Ã€=t#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡À¡#;Ä¡#t¡Ä¡#ˆˆÀ #@%ÿ£Ä¡#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=(¢#u €úúu¡¤t#H£¤t#郍v÷ÂÀuxÿ(¢#œúX‰Á¡ ¢#;$¢#t¡$¢#ˆà¡#@ƒà?£$¢#ë"‰ö¡$¢#+(¢#ƒÀAƒà?£$¢#Ç(¢#‰ÈPƒ=(¢#uÇ(¢#ƒì ÿ5¨t#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ň$uè©óNj¸ÿÿÿÿ鏐ƒ=$tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€a$ t ÿ€d$ë-v‹EÑàE‰ÂÁâ)‹Õd$ƒì‹•À$ÿuRÿP@ƒÄ‰ØPéè3·…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€a$ t ÿ€d$ë2v‹EÑàE‰ÂÁâ)‹Õd$ƒì‹•À$ÿuRÿP@蔃ĉØPé­úèúNjŒ$R‰ÑÁá)Ñ»`$f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€d$ë?vƒìU‰ÐPjÿìt#‹MI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@è/ƒÄ¡Œ$@‰ÂÁâ)ƒì ¿Õh$PèhÇèƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuèîñnj¸ÿÿÿÿé"‰öƒ=$„“œúX‰ÇÇEð}ð™s¾`$‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€d$ë6ƒìEðPjÿìt#‹MðI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@ƒÄÿEð}ð™~“‰øPé}‰öèCµ…À„›œúX‰ÇÇEð}ð™w¾`$‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€d$ë8vƒìEðPjÿìt#‹MðI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúèÒŋŒ$R‰ÑÁá)Ñf‰Íh$ÇEð}ð™w¾`$‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€d$ë8v‹MðI‰ÐÁà)ЋÅd$ƒì‹•À$QRÿP@ƒÄEðPjÿìt#ƒÄÿEð}ð™~èÞ ¡Œ$@‰ÂÁâ)ƒì ¿Õh$PèÅèÁƒÄû¸eô[^_]ÃU‰åSƒìúèëċŒ$R‰ÑÁá)Ñf‰Íh$ƒìhD$j謃čUð¡H$;˜$|¡D$+”$‰Eð¡H$+˜$ë!‰ö¡D$+”$H‰Eð¡H$+˜$ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qè. ƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRLè{ ƒÄhŒ$jÿìt#ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèV ¡Œ$@‰ÂÁâ)¿Õh$‰$è“Ãè:ƒÄû‹]üÉÐU‰åƒìhÜ-"èصƒÄÉÍvU‰åƒìjèõƒÄÉÉöU‰åƒìƒ=´t#u(èè
+ƒì ¡Œ$@‰ÂÁâ)¿Õh$Pè$ÃÄÉÍvU‰åWVSƒìhêI#è!6ƒÄ»`$ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì h$èzA‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾`$¡°t#‰3@£°t#‹E ‰Dƒìjÿuƒt$PèPÔÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
+f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B +‰ƒ`$¿d$Ç;¾h$¡Œ$@‰ÂÁâ)‹DÖ0‰3ºl$ǍAP‹]ð‰˜`$Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁÀ$°Ç8Ç0ǁÁÀǁ`$Ç9ºۍƒ€ 
+Ç…Ä$Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂh$ÿÿÿÿǂl$´$‰0$º‹Mðɍ€ ‰ö
+Ç…0$Bƒú~ì»ëC;$sƒì‹À$ÿuSÿPƒÄ…Àxß;$u7‹]ð[‰ÂÁâ)ÂfÇՈ$ƒìh$SèŠ?èQëDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžd$ƒì‹À$ÿuÿuðSÿP,ƒÄ…ÀyWfdžˆ$ƒìh$ÿuðè*?èñêDžë'èãêǃ釃ì ÿuðè9èÈêdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5„$s0ƒìµ‹ƒ $WVÿP ƒÄ…Àxۃ싃 $WÿuðVÿP$ƒÄ;5„$t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õl$‰Æ‹UÑâU‰ÐÁà)Ѓ Ő$@ën‰öƒì ‹UÑâU‰ÐÁà)зŎ$Pè@‹UÑâU‰ÑÁá)Ñ»l$‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìè{éLjëtv‹EÑàE‰ÂÁâ)»`$·DÓ.ƃì ·GPjÿwVhÈ4"èÝ¢‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèélj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õh$ƒìU‰ÐPjÿìt#ƒÄöGu ÿ€$ëvöGuÿ@$¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅd$‹…À$ƒx(„èà…À‰€»;„$svƒì‹ $VSÿP(ƒÄC;„$råv‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿR0fǃˆ$ƒÄh$Vè <ƒÄèÐçLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;„$svƒì‹ $VSÿP(ƒÄC;„$råv‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿR0fǃˆ$ƒÄh$Vè\;ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Œ$@‰ÂÁâ)¾`$SÿTÖú‰$èn¡Œ$@‰ÂÁâ)¿DÖ‰$較čeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº`$öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸d$‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹h$‰Mì‹Uä‹
+‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…Ä$‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ +Œ$I‰ÐÁà)ЍÅö‚$tɍ€È‚$…Ä$¡D$;”$|;”$uA¡H$;˜$}4ƒìSÿ5Œ$ÿ5˜$ÿ5”$ÿ5H$ÿ5D$hJ#èèËƒÄ è@ ‹]üÉÍvU‰åWVS‹ +Œ$I‰ÐÁà)ЍÅöƒ$„›ɍ€ȍ‹°h$ºd$‹t‚`‹”À¸l$94s‰4‹Œ$[‰ÁÁá)ÁÁፁÀ°`$¿d$B‰8±°‹†h$@º‰Ñº÷ñ‰–h$ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàº`$öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õ $‰…ötI‰ÂÁâ)‹Õ$‰…ÿtI‰ÂÁâ)‹Õ$$‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕ$‹…Ä$‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàº`$öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ`$ǀd$ǂ$û¸]ÍvU‰åWVSƒì ƒ=Œ$ÿt¡Œ$@‰ÂÁâ)ÂöՐ$…3ƒ=Œ$ÿ„ƒìhD$jè]ŸƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë"v¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QènüÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)Ћ<Åd$ƒì‹½À$QWÿP<ƒÄ¿4½ƒì ‹†À$WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅd$‹…À$SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Œ$‰ $‰Œ$[‰ÐÁà)Ð;Å°$t0»`$‰ö¡Œ$@‰ÂÁâ)‹TÓP‰Œ$ R‰ÈÁà)È;TÃPu×;5Œ$tƒìhŒ$jÿìt#ƒÄ‹ +Œ$I‰ÐÁà)ÐÁà¾`$fÇD(‹¸d$ƒì‹½À$‹ $¸;Œ$•ÀPQWÿS8¡Œ$@‰ÂÁâ)ƒÄöDÖ1„Ü¡ $;Œ$…Ë¡D$‰EèM行$@‰ÂÁâ)»l$‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5H$‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Œ$@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰QjhôB"ÿuìÿuèÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè«MƒÄ‰œ$¡D$£”$¡H$£˜$eô[^_]ÉöU‰åWVSƒìÇðÀ%úÿuèD»ƒÄ¿d$¾`$‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂl$ÆDB fÇD0fÇD0
+fÇD0 fÇD0B0Ç0Ç8ǀh$ǀl$‚¤$Ç@Çǂ¬$BP‰0Ç8ÇD`DŽÐ‚8$Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀh$ǀl$ÂÀÇ2Ç:ºۍƒ€ v
+ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀh$ÿÿÿÿǀl$ºۍƒ€ 
+DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹h$[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ`¾%ÿÿÿÿ»™¹l$[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéǼ$ÿÿÿÿÇ$Lj$Ç€$Ç@$Ç $ÿÿÿÿÇŒ$ÿÿÿÿÇœ$ÿÿÿÿǘ$Ç”$ǐ$Ç„$Ç$èÚè}èäGƒì ÿuèqÉÿÿ£$ƒÄ=×Övƒì h`J#èQ%Ç$è¹ÐƒÄ¸ƒ=$”À‰Eè]è¡$‰CÇðÀ%èj˜ƒì Sèa¢Ç$ˆC"èµÜÇ$È-"è1¤Ç$àB"èE¤ƒÄjjèEÿôt#ƒÄhD$jèü˜èOùÿÿ蚱f£$¡Œ$@‰ÂÁâ)¾`$¿DÖ‰$è±Ç$èç£ÿðt#ÇðÀ%ƒÄ»ƒ=ˆ$ŸÃSjèɃă=@$teè„ Ç´t#ƒìhD$jèk˜è±f£$è³øÿÿÇ$àB"èw£¡Œ$@‰ÂÁâ)¿DÖ‰$èç°Ç$èO£ƒÄÇðÀ%ƒìSjèCèr—ÇðÀ%ƒÄjjè(ƒÄúƒ=ˆ$t"ƒìÿ5ˆ$h‹J#èÂÇ$ÿÿÿÿèσăì jèû΃čeô[^_]ÃU‰åSƒìƒ=´t#…•èŸ…Àuúè5°‹Œ$R‰ÑÁá)Ñf‰Íh$‹E£ˆ$Ç´t#ƒ=Œ$ÿ„ƒìhD$jèG—ƒÄUð¡H$;˜$|¡D$+”$‰Eð¡H$+˜$ë ¡D$+”$H‰Eð¡H$+˜$ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèZôÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿR<Ç $ÿÿÿÿÇŒ$ÿÿÿÿƒÄ謝…Àtƒì ¿$PèÜ®ƒÄëvƒì ¿$PèÄ®èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»ºÀ$¡À$ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwºÀ$‹šƒx(uи‹]üÉÉöU‰åƒìè èÈ@ÉÉöU‰åƒìÇœ$ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=ðÀ%tƒ=@$t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjè
+•‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸ˆ$ƒ=Œ$ÿt‹Œ$R‰ÐÁà)ЍÅÀ$]ÉöU‰åSƒìœúX‰Ãƒ=ðÀ%tƒ=@$t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹H¢#t[¿@¢#ƒ<9tP‹Œ$ҍ‚€Ð؍…о`$ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Œ$ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt +ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾@¢#»D¢#¹H¢#vRÁàÇ0B‰Çƒú~ãÇ8¨#ÿÿÿÿÇ@¨#ÇH¢#Ç@¢#ÇD¢#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=@¨#ÿu û¸ ënv¡@¨#@Ç•H¢#‰¡@¨#@‹…D¢#£@¨#‹@‹U ‰…@¢#º»`$‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Œ$À’ÂU‹•0$û]ÍvU‰å‹Múƒùw +Iƒ<…H¢#u û¸ë%v¡Œ$À’ÂʋE ‰•0$û¸]ÃU‰åS‹]œúX‰Áƒûw +[ƒ<…H¢#u‰ÈP¸ë.v[Áà‹@¨#‰D¢#ǀH¢#‰@¨#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Œ$‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿`$öD0 tm‹E‰‚,$‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºh$ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿRD‰tPƒÄ¹»`$;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Å´$t[»d$ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»`$¿DÓP脏ƒÄEðPjÿìt#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õl$èÁ ƒÄ»;„$sƒì‹ $ÿuðSÿP(ƒÄC;„$rã‹MðI‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRPÇŒ$ÿÿÿÿÇ $ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöՐ$u&ÿ +€$ƒ=€$uBèZúÿÿë;ƒìRjè AƒÄëg‹Eð@‰ÂÁâ)ÂöՐ$uÿ +@$ƒ=@$uèúÿÿƒìhD$j肏ƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº`$öD0ufƒ|(uèÒNJû¸ÿÿÿÿ麍v‰ÐÁà)Ðöő$tû雉ö;5Œ$uJv‰ÐÁà)л`$‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èU§ƒÄ»ëvC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)Ё Ő$û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuè’Ñnj¸ÿÿÿÿé‰öú¡ $@‰ÂÁâ)Âf‹Mòf; Ռ$”Eñ¾¿`$‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Œ$u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡ $@‰ÂÁâ)¿Õh$PèÌ¥ƒÄëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿`$v‰ÐÁà)ÐÁàfƒ|(tL÷D0
+uB»ë‰öC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Œ$@‰ÂÁâ)»`$‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èÒ¤ƒÄ‹]üÉÉöU‰åS‹M‹] ¡¸t#ʼnŠ`¨#‰šd¨#@£¸t#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Œ$@‰ÂÁâ)¿Õh$‰$èj¤ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=”«#ÿuèøÎǂ‰ØP¸ÿÿÿÿéۋ +”«#‰ÊÁâ‹‚ ©#£”«#‹E‰‚©#‹E ‰‚©#‰ðƒà‰‚©#‰ðƒàƒøtOƒø
+ƒøt +ësvƒøtSëi‰ÈÁàǀ ©#ÿÿÿÿƒ=€«#ÿu‰ +€«#ë¡„«#Áà‰ˆ ©#‰ +„«#ëH‰ö‰ÊÁ⡈«#‰‚ ©#‰ +ˆ«#ë.‰ÊÁâ¡Œ«#‰‚ ©#‰ +Œ«#ë‰ÊÁ⡐«#‰‚ ©#‰ +«#‰ØP¸[^]ÐU‰åƒìƒ=$uƒì hÀJ#èPÇ$è¸ÁƒÄ¡$P‰$ÉÐU‰åƒìƒ=„$uƒì hßJ#èÇ$è|ÁƒÄ¡„$P‰„$ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèy¶ÿÿƒÄeô[^_]ÉöU‰å¸¹ ©#v‰ÂÁâ@‰
+ƒø&~òÇ|«#ÿÿÿÿÇ€«#ÿÿÿÿÇ„«#ÿÿÿÿLj«#ÿÿÿÿÇŒ«#ÿÿÿÿǐ«#ÿÿÿÿÇ”«#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹€«#Ç€«#ÿÿÿÿë:‰ö‹ˆ«#Lj«#ÿÿÿÿë&‰ö‹Œ«#ÇŒ«#ÿÿÿÿë‰ö‹«#ǐ«#ÿÿÿÿÇ$ƒûÿtM¾ ©#…ÿt‰ØÁàƒ¸©#uƒì ‰ØÁàÿ°©#ÿ©#ƒÄ‰Ù‰ØÁà‹0‰Â¡”«#‰2‰ +”«#ƒûÿu¸Ç$eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèùœÇ$ «#èuéƒÄjjhÿÿjh¤«#h «#è ßƒÄjjhÿÿÿhhÀ«#h «#è€ßƒÄjjhÿÿÿþhhÜ«#h «#è`៎ ƒ}ütƒì‹EüHPÿuøh «#è*ރă}ôtƒìÿuôÿuðh «#èރÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh «#è¸ßƒÄÉÍvU‰åƒìÿuÿuÿu ÿuh «#èháƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh «#èbáƒÄ ÉÐU‰åƒì ÿu ÿuh «#èæƒÄÉÐU‰åƒìÿuh «#èýãƒÄÉÃU‰åƒìÿuh «#èýçƒÄÉÃU‰åƒì jÿuh «#è߃ÄÉÉöU‰åƒì ÿu ÿuh «#è®åƒÄÉÐU‰åƒìh «#è¼ãÇ$ «#èÐçƒÄÉÍvU‰åWVSƒì ¾ú»ë‰öCƒû/ۍCÁàö€¬#tèƒìÿ°¬#ÿuèo°ƒÄ…Àuо…öt#} ÀuèýÈÇûéِû‰ØéÕ÷E @uèÚÈÇû鶉ö÷E uè¾ÈÇ +û隉ö‹u‹=0³#ƒÿÿ„zƒì ÿuèK°@‰$èþÿÿÿWÁ⹬#‰
+ƒÄ…ÀuèmÈÇûéIƒìÿuÿG…ÿ³¬#è:¯ƒÄ…öt‹F‰ƒ¬#‹F‰ƒ ¬#ë vÿGÁàǀ¬#
+ǀ ¬#€ƒì ÿG…ƒ8¬#P臍ƒ@¬#‰$èyCº¬#ǹ¬#ÇÿÿÿÿÇD ƒÄ÷E t
+Ç ëÿGÇ…¬#ƒì ÿG4…‹†¬#¯† ¬#PèôüÿÿV‰‚¬#ƒÄ…Àu0ƒì ÿuè +¯ƒÄ@Pÿ¶¬#èAýÿÿè@ÇǃÄûéƒì ÿG…‹ƒ¬#@ÁàPè’üÿÿs‰† ¬#ƒÄ…ÀuNƒì ÿuè«®ƒÄ@Pÿ³¬#èßüÿÿƒÄ‹ƒ¬#¯ƒ ¬#Pÿ¶¬#èÃüÿÿèÂÆǃÄû雍v»ý‰ÁøGº¬#‰Uð‹‚ë+‰Î7WÁâ‹‚¬#‰Eì [C‹]ì‰D‹‰Ã‰ñ‹uð‹2H9Ã|ЍÿWÁ⾬#‹2@‹Š¬#ÇDüÿÿÿÿǂ ¬#‹D@£0³#û‰øë‰öèÆÇû¸ÿÿÿÿeô[^_]ÍvU‰åWVSƒì úƒ}w‹UҍBö…¬#uèàÅÇ û¸ÿÿÿÿ重vƒì ‹EÀXÁ㾬#ÿ43èh­ƒÄ@Pÿ43èŸûÿÿƒÄ¾¬#‹3¯ƒ ¬#P{ÿ47èûÿÿƒÄ‹3@ÁàPÿ· ¬#èiûÿÿǃ¬#¡0³#‰D@‹U‰0³#ƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}»ú¾öFÁàö€¬#tƒìÿ°¬#Wè[¬ƒÄ…Àu»Fƒþ~ͅÛ„…ƒì W蜬ƒÄ@Pö^Áãÿ³¬#èÇúÿÿƒÄ‹ƒ¬#¯ƒ ¬#P{ÿ·¬#è¨úÿÿƒÄ‹ƒ¬#@ÁàPÿ· ¬#èúÿÿǃ¬#¡0³#‰ƒH¬#‰50³#ƒÄû¸ëvècÄÇû¸ÿÿÿÿeô[^_]ÍvU‰åWVSƒì‹}ÇEìÿÿÿÿÿG…‹ˆ¬#‹€ ¬#‰Eä‹U R‹]䋃‰EðƒùÿtBý‰Eà ‰ÆÈë'‰ö‰Mì‹UàG‹…¬#1‹Lƒƒùÿt4 1‹Uð;ƒvӃ}ìÿtÿG‹…¬#‹]ì[‹] ‰\‚됍ÿG‹U ‰…¬#ÿG‹…¬#‹] [‰L‚ƒÄ[^_]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$ uƒì‹Ýd®#ÀP•8¬#ë2[‰ÐÁà)Ѝ4Åfƒ¾ˆ$
+u=ƒì‹Ýd®#ÀP•@¬#RS賋–d$ƒÄ‹•À$SRÿPD¸ƒÄ븍eø[^]ÃU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$ u)¡Œ$ÇÅ`®#ƒì‹Ýd®#ÀP•8¬#ëB[‰ÐÁà)Ѝ4Åfƒ¾ˆ$
+uM¡Œ$ÇÅ`®#ƒì‹Ýd®#ÀP•@¬#RSèó‹–d$ƒÄ‹•À$SRÿPD¸ƒÄ븍eø[^]ÃU‰åWVSƒìLèÞ;úƒ=¼t#t+Ǽt#ƒìjhpX"èkòÿÿƒÄjhY"è0ƒÄƒ}w‹UҍBö…¬#uè³ÁÇ û¸ÿÿÿÿéV‰ö‹MɍA‹U;… ¬#vè†ÁÇZû¸ÿÿÿÿé)ƒ} vèiÁÇû¸ÿÿÿÿé ‹MɍAÁàƒ¸ ¬#ÿ…Ïö€¬#tè1ÁÇ û¸ÿÿÿÿéÔ¡Œ$ÇÅ`®#ƒìhD$jè}ƒÄUÀ¡H$;˜$|¡D$+”$‰EÀ¡H$+˜$ë"v¡D$+”$H‰EÀ¡H$+˜$ʚ;‰B‹MÀ ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ĺÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qè®ÚÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ +Œ$I‰ÐÁà)л`$fÇDÃ( ƒÄ‹UҍB…8¬#PQèf +ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèµÜÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èõ”èt'ès9¡Œ$ƒÄƒ<Å`®#t脿Çû¸ÿÿÿÿé'v‹MɍA…z ¹¬#‹‰E´B‹˜ ¬#‹u´v‹T“‰ÿ‹UҍB‰÷¯<… ¬#<…¬#‹MÁé‹u ‹Eüó¥¨tf¥¨t¤ҍB<…_¹ ¬#‹ ‹u´vÁà‹u‰4‹ ‹M‰Lƒìÿu´ÿuèzúÿÿƒÄƒ»¬#…dƒì ‡@¬#Pè׉ƃăþÿtqèܓ‹Œ$R‰ÑÁá)Ñ»`$f‰Dˍv‰ÐÁà)ЋÅd$ƒì‹…À$VPÿRDèMÛÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$荓è4åÿÿƒÄûéލv‹uöF…¹¬#‹
+©„·ƒàû‰
+B ƒ<ujÿ° ¬#ÿ°¬#jè•鋋UҍBÁàP ¹¬#ƒ<
+utƒÀ0ƒ<tÿ² ¬#ÿ²¬#ÿ4ëNÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹MɍAÁà,¬#Rÿ°0¬#EÈPE¼Pè)ƒÄû¸eô[^_]ÃU‰åWVSƒì,‹} è 7úƒ=¼t#t+Ǽt#ƒìjhpX"è˜íÿÿƒÄjhY"è1+ƒÄƒ}w‹UҍBö…¬#uèà¼Ç û¸ÿÿÿÿékv‹UҍB‹U;… ¬#vè²¼ÇZû¸ÿÿÿÿé=‹UҍBÁຬ#ƒ|ÿ…ÐöDtèx¼Ç û¸ÿÿÿÿév¡Œ$ÇÅ`®#ƒìhD$jèáxƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë"v¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèòÕÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ +Œ$I‰ÐÁà)о`$fÇDÆ(
+ƒÄ‹UҍB…@¬#PQèªÇŒ$ÿÿÿÿÇ $ÿÿÿÿèù×ÿÿ¡Œ$@‰ÂÁâ)¿DÖ‰$è9è¸"è·4¡Œ$ƒÄƒ<Å`®#tèȺÇû¸ÿÿÿÿéSv‹UҍB‹…¬#ҍBÁຠ¬#‰Þ¯4°¬#‹‰ÁÁéüó¥¨tf¥¨t¤‹UҍBÁà‰E܉ƃƹ¬#ÿ‹† ¬#‰Eà[<•‹T8‰–¬#‹U܃ ‰U܋
+‹Uà‰D:‹E܉ƒ}t‹† ¬#‹8‹U‰‹UҍB<…‹¬#[‹D‘‰Eäƒì ‡8¬#Pè
+‰ÆƒÄƒþÿtm菋Œ$R‰ÑÁá)Ñ¿`$f‰Dύv‰ÐÁà)ЋÅd$ƒì‹…À$VPÿRDè…Öÿÿ¡Œ$@‰ÂÁâ)¿D׉$èŎèlàÿÿƒÄûë‰öû‹Eäeô[^_]ÃU‰åVS‹U‹] úƒúwҍBö…¬#uè6¹Ç û¸ÿÿÿÿëwҍB …¾¬#‹1©t$…Ûu ƒàû‰1ûëIvè÷¸Çû¸ÿÿÿÿë8ҍBÁàƒˆ¬#$¬#‹‰‹S‰P‹S‰P‹S ‰P ‹S‰Pû¸[^]ÐU‰åSƒì‹]‹MúƒûwۍCö…¬#uè„¸Ç û¸ÿÿÿÿëd‰ö…Ét2ۍCÁà‹¬#â‰‹¬#‰Q‹ ¬#‰Q‹€¬#‰A  ۍ KÁỬ#‹%ÿ÷ÿÿ‹U ‹â Љû¸‹]üÉÐU‰åƒì‹U‹M úƒúwҍBö…¬#uèå·Ç û¸ÿÿÿÿë;vҍBÁà‹¬#â‰‹¬#‰Q‹ ¬#‰Q‹€¬#‰A û¸ÉÉöU‰åWVSƒì} ‹uEðPh4K#V詉Ãăûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;Àt#~hƒìWVh@³#èòŸƒÄj
+Vè7ŸƒÄ»…À•ÃœúX‰Æƒìh@³#‹Eðÿ4…Ät#h9K#èIƒÄ…Ûuƒì hÜK#è5ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4K#Sèû¨ƒÄƒøuƒ}ôvÇEôƒÃëÇEô‹Eôº;Àt#~JƒìVSh@³#è.ŸƒÄj
+SèsžƒÄœúX‰Ãƒìh@³#‹Eôÿ4…Ät#h9K#菜ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
+ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5@·#è;ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5@·#èÎ:ƒÄ‰EÄÇEìÇEðè5µ‹ƒì jEÀPEÈPÿuhAK#è}Ìÿÿ‰ƒÄ ƒøÿt ƒì Pè.ÁÿÿƒÄèþ´‰¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5@·#èO:ƒÄÉÉöU‰åƒìÿ5@·#èO:ƒÄÉÉöU‰åƒìÿ5@·#èg9ƒÄÉÉöU‰å‹E‹U ‹M£@·#‰D·#‰ +H·#]ÐU‰åVS‹]èk´‹0ƒì Sè°áÿÿ‰ÃèY´‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5@·#èÕ9ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5@·#èk7‰ÃƒÄ…Ûu#ƒìÿ5@·#èd9ƒÄ+PWÿ5H·#èRjƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] SÿuèiƒÄÿ5@·#è#9ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVè@.ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5@·#è8‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuè¡.ƒÄ W‰Ø)ðPÿuèøhƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÅ.‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u +ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лd$‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»h$‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿ$ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8$‰U苀<$‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8$|[‰Eäv1‰ÐÁà)ЍÅ;š8$u ‹Eì;‚<$|1‰Ï‰ÐÁà)Ћ Ÿ$ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8$}«ƒÿÿt‰ÐÁà)ЋU‰Ÿ$ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$ë
+‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜l$¿h$‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»l$v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õ¸$‰ƒøÿt@‰ÐÁà)ÐÇż$ÿÿÿÿë
+vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Ÿ$‹@‰ÂÁâ)‰ Õ¼$됉KI‰ÐÁà)ÐÇŸ$ÿÿÿÿI‰ÐÁà)ÐÇż$ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰ż$‹C@‰ÂÁâ)‰ Õ¸$ë‰ö‰ I‰ÐÁà)ÐÇż$ÿÿÿÿI‰ÐÁà)ÐÇŸ$ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8$‰U苀<$‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8$|[‰Eäv1‰ÐÁà)ЍÅ;š8$u ‹Eì;‚<$|1‰Ï‰ÐÁà)Ћ Ÿ$ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8$}«ƒÿÿt‰ÐÁà)ЋU‰Ÿ$ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лd$‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»h$‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿ$ë
+‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹l$‹°h$ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»h$‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»l$‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŸ$‰ƒøÿt@‰ÐÁà)ÐÇż$ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õ¼$[‰ÂÁâ)ÕP‹‰‚h$ǂl$ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Œ$@‰ÂÁâ)4Õ`$…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ`¹#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì R范ċ^8‰Ø÷Ћ +`¹#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ň$u +¸éӍvú‰ÈÁàö€h·#uƒ¸`·#uû魉öv‰ÐÁà)ЍŜ$ƒùvèÍ©Çë
+¸Óà »ëC;èt#}ƒìÝÿ°$º#Vÿ º#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»ˆ$u&ƒìhd¹#VèÔüÿÿ‹ƒd$ƒÄ‹…À$VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ`·#ü¹‹}ó¥…Òt‰ßÁçÇ`·#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<€¹#ÿtq4‰u캀¹#‹@Áà‰Eè‰ÇƒÇ‹ +Ç%¸Á%‹U苉E䋇Á%©t +ƒàý‰‡Á%ë‰ö¾€¹#‹Uì‹2@‰ ÕÁ%‰Áƒ}äÿu»‰ +Ç%ǝ€¹#ÿÿÿÿƒûv +è¨Çë¸þÿÿÿˆÙÓÀ!`¹#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#`¹#…Àt +‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà `¹#‹5d¹#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅ $ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸ˆ$uœ$ƒûv +輦Çë 8ƒìhd¹#Vèúÿÿv‰ÃÁã)ÃÁ㋃d$ƒÄ‹…À$VPÿRDÃà¾`$ƒÄƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Ÿ$ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸ˆ$„…˜$ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍŜ$ƒûvèÃ¥Çëv 8»ëvC;èt#}0ƒìÝÿ°$º#Vÿ º#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 +‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#`¹#…Àt ‹UԉÐPéÃ=Ç%ÿu‹MԉÈP¸ 鮉ö‹5Ç%vÁà¹Á%‹‰Ç%‹U ‰Á%‹U‰Á%‹U‰ Á%‹Œ$‰Á%Çÿÿÿÿ‹E Á຀¹#ƒ<ÿu‰4ë>‰ö‹M ‹€¹#‰ÁЃ<ÅÁ%ÿt»Á%
+‹Í 
+ƒ<ÃÿuîR‰4ÅÁ%ƒ} vèé£Ç됸ŠM Óà `¹#‹5d¹#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅ $ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸ˆ$uœ$ƒ} vèS£Çëv ƒìhd¹#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃d$ƒÄ‹…À$VPÿRDÃà¾`$ƒÄƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Ÿ$ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸ˆ$„…˜$ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍŜ$ƒ} vèV¢Çë‰ö »ëvC;èt#}0ƒìÝÿ°$º#Vÿ º#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=ät#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Œ$@‰ÂÁâ)<Õ`$èŠú¡`¹##„Hºv©u=BÑøuô¾ƒ<µ€¹#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!`¹#ûév µº€¹#‹[‹ÅÁ%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!`¹#W<ƒþv +èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹Á%‹
+‹u ‰‹‚Á%‰F‹‚ Á%‰FƒÂ‹
+©t ƒàý‰
+ëv[¡Ç%‰ÕÁ%‰Ç%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u +û¸ éÓ‰ö‹‰G@úèu‹Œ$R‰ÑÁá)Ñf‰Íh$ƒìhD$jèN\ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qèc¹ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRHƒÄhd¹#ÿ5Œ$èæòÿÿ¡Œ$@‰ÂÁâ)ÂfÇՈ$ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày +ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Œ$h$‹"ÿuÜÿuØÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jèù ƒÄ¡Œ$@‰ÂÁâ)‰Õ@$ÇŒ$ÿÿÿÿÇ $ÿÿÿÿè׺ÿÿƒì ¡Œ$@‰ÂÁâ)»`$¿DÓPèsè”ÇG@¡Œ$@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡`¹##„ûº‰ö©uáBÑøuô¾ƒ<µ€¹#ÿu=‹M ‰1ÇAÇAƒþv +è@Çë¸þÿÿÿ‰ñÓÀ!`¹#ûé vƒì µƒ€¹#Pèúðÿÿ‰ÇƒÄƒ»€¹#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!`¹#Áâ¹Á%‹
+‹] ‰‹‚Á%‰C‹‚ Á%‰CƒÂ‹
+©t ƒàý‰
+ëv¡Ç%‰ÕÁ%‰=Ç%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Œ$@‰ÂÁâ)4Õ`$è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Œ$R‰ÑÁá)Ñf‰Íh$ƒìhD$jè6XƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèJµÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRHƒÄhd¹#ÿ5Œ$èÍîÿÿ¡Œ$@‰ÂÁâ)»`$fÇDÓ(ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèY·ÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=º#ÿu
+ÇEèëWMèUð¡º#;B|¡º#+Eð‰E衺#+Bëv¡º#+EðH‰E衺#+Eôʚ;‰Aƒì ÿ5º#ÿh$ƒÄ…ÛtN]ð‹Eð£º#‹Eô£º#jh„‹"ÿuôÿuðÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè:ƒÄ‰º#ë +vǺ#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ€¹#ÿuC‰uèÇEìÇEð¡Œ$‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!`¹#降 µº€¹#‹[‹ÅÁ%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!`¹#[Áà¹Á%‹‰U苐Á%‰U싐 Á%‰Uð‹Á%‰UôP‹
+©tƒàý‰
+ë[¡Ç%‰ÕÁ%‰Ç%ƒìEèPVè
+ƒÄeø[^]ÃU‰åVSƒì¡Œ$@‰ÂÁâ)4Õ`$‹F0©…Í +‰F0‹F8‰Ã÷Ћ`¹#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
+CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ +`¹#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
+CÑøuòº‰UèÇEìÇEð¡Œ$‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Œ$@‰ÂÁâ)Õ`$‰UЉÞÁæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShLK#èw}ƒÄ÷Eàtƒì‹M ÿqhbK#èX}ƒÄƒì jèç½ÿÿƒÄ‹UЋB8‰EԉƍUԃûv +èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv +è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾`$fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄƒìhd¹#Wèúèÿÿ‰ÂÁâ)‹Õd$ƒÄë ‰ÐÁà)ÐÁàfƒ¸ˆ$u!‹d$ƒì‹•À$WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿h·#¾d·#»l·#¹€¹#‰ö‰ÐÁàǀ`·#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»Á%¹Á%RÁàB‰ÇDƒú>~éÇèÆ%ÿÿÿÿÇüÆ%ÇÇ%Ç`¹#Çd¹#ÿÿÿÿǺ#ÿÿÿÿº¹Àº#»Äº#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjh†"è¾ÄÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu +‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Œ$è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Œ$@‰ÂÁâ)¡`¹# ՜$‰¸]ÉöU‰åSƒì‹E‹U ú‹Œ$‰Œ$Çät#jPj jèœìÿÿƒÄÇät#‰Œ$û‹]üÉÍvU‰åS‹M‹] ¡èt#ʼnŠ º#‰š$º#@£èt#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…Ⱥ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹Àº#‹E ‰
+‹E‰‚ĺ#ÆD
+ƒìjhċ"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Œ$‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸`$DŽàÿÿÿÿL0ƒìhd¹#Vèõãÿÿ‹ƒd$ƒÄ‹…À$VPÿRDè7¢ÿÿƒÄeø[^]ÐU‰åƒìǺ#ÿÿÿÿjjèWèÿÿè¢ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿìt#‹UüRÁà¹Àº#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…ĺ#èö›ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=€Â#ÿt ƒ=Ç%ÿuûèƒÇ ¸ÿÿÿÿéCv¡€Â#‰‹€Â#Õ)п„»#‹DÇ0£€Â#‹Õ)й€»#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)Љň»#닍<Å)Ǎ<ý€»#ü¹ó¥‹Õ)ЍŃº€»#u#¡Ç%‰‚¨»#@ÁàƒˆÁ%‹€Á%£Ç%‹Õ)ÐÇŔ»#ÿÿÿÿ‹Õ)ЍŘ»#Ç@NjÕ)ЍÅ »#Ç@NjÕ)ÐÇŬ»#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Å°»#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀ°»#ƒÀº„»#ƒ<ÿtƒì ÿ4ÿh$ƒÄÝ)ØÁàƒ¸€»#uE‹¨»#R ÅöÁ%u¡Ç%‰Á%‰Ç%Ý)؋Ũ»#@ƒ$ÅÁ%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸€»#…‹P ‹‚ˆ»#@öÅÁ%t¸Œ»#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJŒ»#¾ˆ»#‹7@‹Ç%‰ÝÁ%£Ç%jÿ41ÿ±„»#jèhçÿÿ‹7@ƒ ÅÁ%錐‹E´Áà+E´Áเ»#ƒ<uwPƒ<
+tÿ°ˆ»#ÿ°Œ»#ÿ4
+ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áàˆ»#Rÿ°Œ»#EÈPEÄPèíÕÿÿƒÄ‹E´Áà+E´Åƒ¸ˆ»#u +ƒ¸Œ»#„Àº »#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒ˜»#‰ƒ »#‹Aƒœ»#‰B…Àyÿ‹ »#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hŽ"ÿ4Ť»#ÿ4Å »#ÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè+ùÿÿƒÄ‹E´Áà+E´‰Ŕ»#ë‰ö‹E´Áà+E´ÇŔ»#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Å°»#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Ŕ»#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹ »#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹ »#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹˜»#õ)ðÁà‹‰‹D‰Gõ)ðÅº„»#ƒ<ÿtƒì ÿ4ÿh$ƒÄ‹Eƒxu
+ƒx „þº˜»#õ)ð ŋ]‹‰
+‹C‰D
+÷E t¸ »#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘ »#‹Eè‹]C‰ »#‹EìC ‰B…Àyÿ‰ »#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhŽ"ÿ4Ť»#ÿ4Å »#ÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè­öÿÿƒÄõ)ð‰Ŕ»#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Å°»#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Ŕ»#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹ »#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹ »#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹˜»#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èÅ®ÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt +ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Å°»#uûè܆ǸÿÿÿÿëvÕ)ЋŬ»#ûÉÐU‰åWVS¹»„»#¿€»#¾Œ»#‰öÍ)ÈÁàÇDÿÿÿÿ˜»#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ|Â#ÿÿÿÿÇ€Â#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Œ$@‰ÂÁâ)¾`$‹DÖ0©t0©t)ƒì jèr°ÿÿ¡Œ$@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œ$@‰ÂÁâ)¹`$‹DÑ0Áèƒà‹U ‰¡Œ$@‰ÂÁâ)Õ0‹
+%ÿþÿÿ ؉
+û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œ$@‰ÂÁâ)¹`$‹DÑ0Áè ƒà‹U ‰¡Œ$@‰ÂÁâ)Õ0‹
+%ÿýÿÿ ؉
+û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5„$s9v‹µ $ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5„$rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹… $ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µÀ$ƒìÿ°ôh™K#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°d$……ƒÀ º`$f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè0¤ƒÄë%v·Ð¸sK#ú€t¸K#út¸‹K#P[‰ÐÁà)ÐÁàÿ°4$t$PShL#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…À$‰Eð‹¸üƒì ‹Uð‹‚ðøPèÔÿÿ‰ÆƒÄƒþÿu +¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åö‘$tRQ@»l$ƒ<D‹D$‰ƒìý‰Ø‹Uð‚ðPVèôÑÿÿƒÄ‹Eð˜ðSVèÓÿÿƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…À$‰Eð‹Mƒy(…©‹=Œ$‰ÐÁà)Ѝžd$‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йl$‹D@‰D@‹„à‰„àƒÂ0¹`$‹
+%ÿ÷ÿÿ‹\0ã ؉
+‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»d$‹A‰„Ѓyt‹A‰‚¬$‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰¬$‹“ô‰D$ƒy$u‹E @‰ÐÁà)Ё Ő$¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•À$ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅ4$‹—ðÂPÿu èAÑÿÿ酋E @‰ÐÁà)ЍÅöƒ‘$t?K@¾l$ƒ<11ºd$‹1„à‰1ƒì‹„Ћ—ðÂPÿu èãÐÿÿë*ƒì‹E @‰ÐÁà)ЋÅ4$‹—ðÂPÿu èKÐÿÿƒÄ‹E @‰ÐÁà)ÐfÇň$€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã +f‰E¸‹À$‹€ø‰EÈÇE̍E¸jjPh˜"h¥K#è}–ÿÿ‰ÆƒÄ ƒþÿuƒì h@L#èjÇÿÿƒÄ‹<À$v‰ÐÁà)Ðfƒ<ň$tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃¤$PjèJ;fǃˆ$€ƒÄ‹ƒ4$‹—ðÂPVè|ÏÿÿƒÄeô[^_]ÐU‰åWVSƒì‹}hªK#èÒÆÿÿèa°ÿÿ‰EðƒÄ hPhÀK#è·ÆÿÿÇ$èdzÿÿ‰ÃƒÄShÞK#è›Æÿÿ‹Eð‰…À$ƒÄ jhêK#Sè=efÇCÆCÇC8¢"ÇCd¢"ÇC ,˜"ÇC$ ™"ÇC(p¢"ÇC,̙"ÇC0|¢"ÇC4„¢"ÇC8¢"ÇC<D›"ÇC@Т"ÇCD\£"ÇCH¤£"ÇCL¬£"ÇCPD¤"ÇCTŒ¤"ÇCXÀ¤"ÇC\¤¥"ÇC`Ä¥"ÇCdÜ¥"ÇChô¥"ÇCl ¦"ÇCp$¦"ÇCt<¦"ÇCxT¦"ÇC|l¦"ǃ€„¦"ǃ„œ¦"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàP萲ÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè‚ÌÿÿƒÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh@œ"舭ÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹À$‰Eð…Éx[; +$sS‹À$‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ň$u +¸éèvv‰ÐÁà)Ð9 Åd$t +¸&éȍv…Ûuv‰ÐÁà)Ё Ő$ë)ƒûuv‰ÐÁà)Ё$Ő$ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿d$‹U9;t\f¸ˆ$€u=ƒì‹;‹Mð‹‘ðÂPVè4Ëÿÿ‹E‰;ƒÄ‹Uð‹‚ð‹MÈPVèQÌÿÿƒÄëv‰ÐÁà)ЋU‰Å4$¸eô[^_]ÍvU‰åVS‹M‹4À$…Éx; +$s‹À$‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Œ$@‰ÂÁâ)¸ÿÿÿÿ9 Õd$uZúè!P‹Œ$R‰ÑÁá)Ñ»`$f‰DËdž託ÿÿ¡Œ$@‰ÂÁâ)ƒì ¿DÓPèçO莡ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…À$‹€ü]ÍvU‰å‹E‹…À$‹€ô]ÍvU‰åS‹]‹M …ÛxU;$sM‹À$‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ň$u¸ëMI‰ÐÁà)Ð9Åd$t ¸&ë3‰öI‰ÁÁá)ÁÁá¸ö‘$”À‹U‰‹‘4$‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E +9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…À$I‰ÐÁà)ЋÅ4$‹“ðÂPQèÓÈÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…À$v‰ÐÁà)Ðfƒ<ň$tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃¤$PjèR5fǃˆ$€ƒÄ‹ƒ4$‹—ðÂPVè„ÉÿÿƒÄeô[^_]ÐU‰åSƒì ‹E‹M ‹…À$I‰ÐÁà)ÐÁàfǀˆ$€‹€4$‹“ðÂPQè8ÉÿÿƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•À$‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃¤$Pjè‹4ÿ 7ƒÄ‹ƒ4$‹Mð‹‘ðÂPÿu èRÈÿÿfǃˆ$€ƒÄë‹E @‰ÐÁà)ÐfÇň$eô[^_]ÐU‰åƒì‹E‹M ‹…À$ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇň$h$QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…À$ƒÀDŽ€R‰ÐÁà)ÐfÇň$]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇň$EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVh´¦"ÿuìÿuèÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jèAäÿÿƒÄ v‰ÈÁà)ȉÅ@$eô[^_]ÐU‰åƒìÿ5Œ$jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Œ$jèñãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèÙãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèÁãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè©ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèyãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèaãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèIãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè1ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºd$‹‹4…À$¿`$fÇD(€‹„Ћ–ðÂPQèÕÅÿÿDŽàÿÿÿÿ衆ÿÿƒÄeô[^_]ÉöU‰åVSƒì h`M#è½ÿÿè­¦ÿÿ‰ÆÇ$Œè'ªÿÿ‰Ã‰µÀ$ƒÄ jhøL#Sè®[fÇCÆCÇC`¨"ÇC”¨"ÇC  ¨"ÇC$Ȩ"ÇC(ÇC,à¨"ÇC0ì¨"ÇC4ô¨"ÇC8©"ÇC<©"ÇC@$©"ÇCDL©"ÇCHt©"ÇCLœ©"ÇCPÄ©"ÇCTì©"ÇCXª"ÇC\<ª"ÇC`hª"ÇCdª"ÇCh¸ª"ÇClàª"ÇCp«"ÇCt0«"ÇCxX«"ÇC|€«"ǃ€¨«"ǃ„Ы"ǃˆÿÿÿÿÇ$M#è¼ÿÿƒÄ jVhø«"è|¤ÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹À$fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…À$ÿ°ˆheL#èìYƒÄÉÍvU‰å‹E‹…À$‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇՈ$]ÃU‰åƒìhtL#èxYƒÄÿ5Œ$j è„àÿÿƒÄÉÍvU‰åƒìh{L#èPYƒÄÿ5Œ$j è\àÿÿƒÄÉÍvU‰åƒìh‚L#è(YƒÄÿ5Œ$j è4àÿÿƒÄÉÍvU‰åƒìh‰L#èYƒÄÿ5Œ$j è àÿÿƒÄÉÍvU‰åƒìhL#èØXƒÄÿ5Œ$j èäßÿÿƒÄÉÍvU‰åƒìh—L#è°XƒÄÿ5Œ$j è¼ßÿÿƒÄÉÍvU‰åƒìhžL#èˆXƒÄÿ5Œ$j è”ßÿÿƒÄÉÍvU‰åƒìh¥L#è`XƒÄÿ5Œ$jèlßÿÿ¸ƒÄÉÉöU‰åƒìh¬L#è4XƒÄÿ5Œ$jè@ßÿÿƒÄÉÍvU‰åƒìh³L#è XƒÄÿ5Œ$jèßÿÿƒÄÉÍvU‰åƒìhºL#èäWƒÄÿ5Œ$jèðÞÿÿƒÄÉÍvU‰åƒìhÁL#è¼WƒÄÿ5Œ$jèÈÞÿÿƒÄÉÍvU‰åƒìhÈL#è”WƒÄÿ5Œ$jè ÞÿÿƒÄÉÍvU‰åƒìhÏL#èlWƒÄÿ5Œ$jèxÞÿÿƒÄÉÍvU‰åƒìhÖL#èDWƒÄÿ5Œ$jèPÞÿÿƒÄÉÍvU‰åƒìhÝL#èWƒÄÿ5Œ$jè(ÞÿÿƒÄÉÍvU‰åƒìhäL#èôVƒÄÿ5Œ$jèÞÿÿƒÄÉÍvU‰åƒìhëL#èÌVƒÄÿ5Œ$jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh„¬"hòL#è‡ÿÿƒÄ ‹À$‰Ã‰šˆƒûÿuƒì h M#èæ·ÿÿƒÄ[‰ÐÁà)ÐÇŘ$ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁຠÂ#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…¤Â#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹pã#ƒúÿtqÕ)Ѝ<…w‹†¤Â#£pã#ƒì ÿuèV@‰$è×£ÿÿ» Â#‰ƒÄÿuPè7U‹Eð‰‡¨Â#‡¬Â#‰$èĽÿÿÆDƒÄû‡¤Â#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿» Â#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾ Â#ÿ43èu£ÿÿƒÃÆD3¡pã#‰ƒ¤Â#‰=pã#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¸Â#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Œ$R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ4… Â#ƒ~ ÿu
+ƒ~…“ƒìWjÿìt#ƒÄhD$jè8)ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë!‰ö¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèJ†ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ +Œ$I‰ÐÁà)л`$fÇDÃ(Íǂ Þ#‹‰‚¤Þ#ƒÄF PQèZ¼ÿÿÇŒ$ÿÿÿÿÇ $ÿÿÿÿèEˆÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$è…@è,’ÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$èF@èí‘ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…¸Â#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Œ$R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ4… Â#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿìt#ƒÄhD$jèš&ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Q讃ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ +Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ +Œ$I‰ÐÁà)л`$fÇDÃ(͋E ‰‚ Þ#‹‰‚¤Þ#ƒÄF PQ迹ÿÿÇŒ$ÿÿÿÿÇ $ÿÿÿÿ誅ÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èê=葏ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$è§=èNÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¸Â#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ… Â#‹JA‰J‹Z ƒûÿtG‹Ý Þ#9È<)Á‰È‰BƒìB PSèb·ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPDèUyÿÿƒÄƒìWjÿìt#ƒÄ‰ðPé¼‰öúèª<‹ $R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ… Â#‹JA‰J‹Z ƒûÿtG‹Ý Þ#9È<)Á‰È‰BƒìB PSè¶ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPDè݃ÿÿƒÄƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$è <貍ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…¸Â#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4… Â#^‹^ ƒûÿts݉‹€ Þ#;F_¿ Þ#ÇEðv‹F+:‰FƒìF PS袵ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿìt#ƒÄƒ}ðtèdwÿÿ‹Uì‰ÐPéõúèÊ:‹ $R‰ÑÁá)Ñf‰Íh$‹E‹Õ)Ѝ4… Â#^‹^ ƒûÿtr݉‹€ Þ#;F^¿ Þ#ÇEð‰ö‹F+:‰FƒìF PSèÊ´ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿìt#ƒÄƒ}ðt贁ÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pèð9藋ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿¤Â#õ)óÁãǃ Â#‰4;ǃ¨Â#ƒì ƒ¬Â#PèÞ³ÿÿƒÃF‰;ƃ¨Â#ƒÄ‰Æþÿ~±Ç˜Þ#ÿÿÿÿÇpã#ƒìjh8»"芔ÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…¸Â#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л Â#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè™ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћpã#‰…´Â#‹£pã#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…¸Â#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…¬Â#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…¸Â#‹Õ)Ћpã#‰…´Â#‹£pã#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…¸Â#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸¬Â#ÿu ‹€¨Â#‰ë7‰öÇ‹Õ)Ћ…¬Â#¹h$vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹pã#‰ƒúÿtnÕ)Ћ…´Â#£pã#‹Õ)л Â#ǃ‹Õ)Љ …¨Â#ƒì ‹Õ)Ѝ…¬Â#Pè±ÿÿ‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…¸Â#uèaǸÿÿÿÿë=ú‹Õ)Ѝ… Â#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<Ո$”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$uAƒì‹ݤÞ#Õ)Ѝ…¬Â#PSè°ÿÿ‹†d$ƒÄ‹…À$SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=øt#…ÚÇøt#¹» Ç%¾$Ç%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh€ã#èÜýÿÿ¹ƒÄ¾„É%»€É%‰ö‰ÁàQ‰0Ɖуù +véÇ´Ë%ÿÿÿÿÆ°Ë%ÇxÉ%¹¾äË%»àË%vÍ)ÈÁàQ‰0ƉуùvãÇÏ%ÿÿÿÿÆ Ï%Ç(Ï%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=xÉ%ÿuèí^ǍûÇEìÿÿÿÿ됡xÉ%€‹ՄÉ%‰xÉ%û‰Eìƒ}ìÿu +¸ÿÿÿÿéìvƒì h€ã#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å@Ç%t0ƒìÿu¿ōƒ Ç%Pè³EƒÄ…Àu€»8Ç%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ@Ç%ƒìÿuƒ Ç%Pè÷D‹E쉃4Ç%ƒÄ€}óu‰Â’‹] f‰ňÉ%ëv‹E썀‹E ¯Ef‰ՈÉ%úƒì ‹U썒Áã·ƒˆÉ%Pè-“ÿÿºŒÉ%‰ƒÄû…Àu%è”]ǒƒì h€ã#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰UྀÉ%‹ƒŒÉ%‰‚„É%‰2ƒìjjƒœÉ%Pè:ûÿÿƒÄ ·D3Pjƒ É%Pè#ûÿÿƒÄ jjÃ¤É%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=(Ï%ÿuèø\ǎûÇEèÿÿÿÿë¡(Ï%Å)‹•äË%‰(Ï%û‰Eèƒ}èÿu_ƒì h€ã#èvôÿÿ‹Eèéä‰öè§\ǐƒì h€ã#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h€ã#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹àË%ŠUòˆT P‹]ì‰
+‹] f‰\
+ǀäË%ÿÿÿÿ‰ºèË%‹]썛ÆՀÉ%ƍ¿ōr¿ Ç%€|>t%ƒì¶D>Pš<Ç%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h€ã#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=(Ï%ÿuèa[ǎûÇEìÿÿÿÿë ¡(Ï%Å)‹•äË%‰(Ï%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàºàË%ˆ\ ‹M f‰LǀäË%ÿÿÿÿƒì h€ã#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å@Ç%u ¿ÆEçë8ƒìÿu¶Å Ç%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸠Ç%ÆD ÆDƒìÿuPè>AƒÄ jjÃ<Ç%Sè/øÿÿÇ$€ã#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº Ç%€|t'þDƒì h€ã#è®ñÿÿƒÄ jjƒ<Ç%Pèûîÿÿ됃ì h€ã#è‹ñÿÿƒÄ¶‹<Å4Ç%¿ŠUó:ŘÉ%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·ňÉ%9E u€}ót(¿·ňÉ%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h€ã#è ìÿÿ¶‹ÅDÇ%ƒÄƒúÿ„­€}óu#è&YǕƒì h€ã#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…ôË%9E t"èíXǔƒì h€ã#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »$Ç%‹‰äË%‹Mì‰ ë/‰öèŸXǑƒì h€ã#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰ÅDÇ%ƒì h€ã#è*ðÿÿ‹EìÁà+EìÁàH‰±èË%ºàË%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗àË%‰Uðh€ã#èÏêÿÿ‹Mð‹Y›ÁãC‰Eèº$Ç%‹€Áà°€É%ƀ€É%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv 訍ÿÿû¹$Ç%‹Eè‹ú ’¡xÉ%‰̈́É%‰xÉ%ûƇàË%ƒÃ ‹Uð‹B‰ƒ$Ç%ú¡(Ï%‰‡äË%‹Mì‰ +(Ï%ûƃ Ç%Ç$€ã#è
+ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…àË%‰Eð‹@€ŀÉ%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…àË%‰Eð‹@€ŀÉ%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìhM#è;ƒÄÿ5xÉ%h‹M#è;»ƒÄÝ)ØÁà€¸àË%t8àË%‹B€ŀÉ%ƒì ÿp ÿp$‹B€Å Ç%PShŸM#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…ðË%’ŀÉ%ÿp ÿp$RQhÀM#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h€ã#èHæÿÿ¿ÓÕ)Ѝ …‹øË%€Å ƒÄ€º Ç%u ‹äË%‰‚$Ç%¿ÃÅ)ÂÁâƂàË%ú‹ +(Ï%‰ŠäË%£(Ï%ûƒì h€ã#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<… $ú‹^…Ûu-ƒì j èdˆÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Œ$u û¸#é~ƒ;ÿtc¾`$‰ö‹ +Œ$I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Œ$‰CÿCè`oÿÿ¡Œ$@‰ÂÁâ)ƒì ¿DÖPèŸ'èFyÿÿƒÄûúƒ;ÿu¤¡Œ$ÿD‡D¡Œ$‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Œ$tû¸髍vúè*'‹Œ$ [‰ÊÁâ)Êf‰Õh$‹E‹… $ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅ°$‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGèfnÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pè¢&èIxÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h$N#蒙ÿÿè]ƒÿÿ‰ÆÇ$蛆ÿÿ‰Ã‰µ $ƒÄ jh8N#Sè"8fÇCÍÆCÇCÇCxË"ÇC ÄË"ÇC$ÐË"ÇC(ØË"ÇC,Ì"ÇC04Ì"ÇC4|Ì"ÇC8ÜÈ"ÇC<ÄÌ"ÇC@ÄÉ"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹… $ƒì hN#è7¾ƒÄƒÃƒìÿt³@hN#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹… $ƒÀƒ|@tƒìRj
+èȽÿÿƒÄÉÍvU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j è#…ÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsè4…ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j 胄ÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
+û¸ë"‰ö¡Œ$‹½ $ƒÂÿD‚@¡Œ$‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹• $ú‹p¸…ö„V‹;Œ$u û¸#éA‹Œ$‹F ¿`$;„“°v +¸é v¡Œ$‹Œƒ°‹“¬…Òt‰ö‹;Œ$…Š‹R…Òu븅À…†‹ +Œ$I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Œ$‰B‹ƒ¬ÿ@èºjÿÿ¡Œ$@‰ÂÁâ)ƒì ¿D×Pèù"è tÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹… $¡Œ$ÿDƒD¡Œ$‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ $ú‹X¸…Û„Ù‹;Œ$uû¸#éčv‹Œ$‹C ;„‘°s
+¸饡Œ$‹´°‹‘¬…Òt‰ö‹;Œ$u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½ $¡Œ$ÿDD¡Œ$‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Œ$tû¸éڍvúè&!‹Œ$ [‰ÊÁâ)Êf‰Õh$‹E‹… $‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅ°$‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu +‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bè3hÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pèo èrÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hdN#è^“ÿÿè)}ÿÿ‰ÃÇ$€èg€ÿÿ‰Æ‰4 $ƒÄ jhxN#Vèî1fÇFÌÆFÇFÇF€Ò"ÇF Ó"ÇF$0Ó"ÇF(`Ó"ÇF,¨Ó"ÇF0ÔÓ"ÇF4,Ô"ÇF8<Í"ÇF<ÄÎ"ÇF@ÈÏ"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹… $ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
+‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹… $ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹… $‰”ˆ°]ÃU‰åWVSƒì‹E‹<… $hN#è0»ƒÄwƒìÿtž@hN#èó/ƒÄCû™~ãƒì hBN#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h^N#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ … $Áâ‹C‰„°ÇD
+D‹$ÉÉöU‰åVS‹E‹u ‹… $ƒ|³DtƒìVj
+èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E +9u
+¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jèƒ}ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè„}ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh‚N#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿àÛ%ÿt8CP‰Eä·8Ph‰N#èá-ƒÄ ÿt;·D;Ph—N#èÊ-ƒÄ ÿt; s·>Ph¨N#è±-ƒÄ ÿt>·D>Ph¹N#èš-ƒÄ ‹Uä·D:P·DLPhÊN#è~-‹UèÕƒÄ·ØShÛN#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh O#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰ºÀ^&fƒ=À^&yA¿Áfƒ<Byfù™~îfù™~ƒì hðN#èÎ,¸ƒÄé ¿Á<¹À^&‰Úf Ê€f‰Ǎ<ÿÁçºàÛ%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇLÜ%¾`&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹àÛ%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽÀ^&]ÉöU‰åSƒì‹]¿E PhO#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhlÞ"SèƒÄhø×"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹üt#€82uºð°îƒìShbP#èˆ*ƒÄÁ㋃üt#@Ph½Z#èp*ƒÄÿ³@u#ènƒÄ‹]üÉÉöU‰åƒìÿuhyP#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=$Ú%„à…ÿ„Ø¡ Ð%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¤Ð%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤Ð%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡ Ð%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=”Ð%…Ρ˜Ð%€€€€€€‰ÃÁã‹ +œÐ%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡˜Ð%‰¡œÐ%éqvƒø…綄Ð%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +Ð%f)Ù·É + Ð%º×®¬]‰È÷êÁú‰ÈÁø)¤Ð%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£ Ð%f‰Ð%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
+‰O¡¤Ð%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹ Ð%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
+‰ð™‰È)Ћ +¤Ð%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=”Ð%…rU衘Ð%‰¡œÐ%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð· Ú%9Æv%h†P#j_h˜P#hŸP#èm%Ç$èmƒÄ· Ú%)ó¯ˆÐ%· Ú%‰Ø‰Ñº÷ñ‰Ãº °
+îì©t‹ +ˆÐ%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡˜Ð%€€€€€€Áà‰Eä‹ +œÐ%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ¨u#ƒ=¨u#uƒ=„u#tÿ„u#¶E÷€ÁàºLÏ%ƒ<uIÇö€PÏ%tûƒì ¶]÷›Áã¾@Ï%ÿ43ÿ“DÏ%ƒÄöDtú¶E÷€Ç…LÏ%ÿŒu#ƒ=¨u#uƒ=ˆu#tÿˆu#ÿ +¨u#eø[^]ÍvU‰åWVSº¿LÏ%¾HÏ%»DÏ%¹@Ï%’ÁàÇ8‰0ÇÇBƒú~ÜǨu#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…LÏ%t÷Æu¸ÿÿÿÿëH’ …ǁLÏ%û…Ût‰™DÏ%º@Ï%HÏ%‰‰t
+됍’Ç…LÏ%¸[^]ÐU‰å¡¨u#]ÉöU‰åSƒì¶„Ð%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ +Ð%f)Ù·É + Ð%º×®¬]‰È÷êÁú‰ÈÁø)¤Ð%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ + Ð%f‰Ð%ÿ¨u#ƒ=¨u#uƒ=„u#tÿ„u#¡œÐ%‰Ã„ã#º¡/¸D‰Ø÷êÁú‰ÙÁù)ʘÐ%’’’’’’’’’Á⠉Ø)УœÐ%‹€Ð%ë$‹¡ŒÐ%‰‰ŒÐ%‰€Ð%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;˜Ð%;˜Ð%uƋB;œÐ%~»ƒ=¨u#uƒ=ˆu#tÿˆu#ÿ +¨u#‹]üÉÃU‰åWVSƒì‹uhÈì"j@èØ +ƒÄƒ>t,ƒì h¹P#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hÕP#è³ ‹N‰ +ˆÐ%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ + Ú%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£”Ð%ƒ=„`&~»A¹C°p‰ÊÚîîÆ„Ð%ë%Æ„Ð%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ÀÐ%»ÄÐ%ƒùbIÁàØÐ%‰0I‰LÃAƒùc~ßÇÚ%ÇŒÐ%ÀÐ%Ç„u#Lju#¡ˆÐ%€€€Áࣄã#ÇœÐ%ǘÐ%Ç Ð%ǤÐ%fǐÐ%ƒ=”Ð%uÇ($¸ã"Çh$Pä"ëÇ($ ä"Çh$,ë"eô[^_]ÃU‰å‹E£„u#]ÍvU‰å‹E£ˆu#]ÍvU‰å‹E£”u#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ŒÐ%tl‹ +ŒÐ%‹£ŒÐ%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹€Ð%}è‹uè됋…Òt‰ð;B  +;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ +€Ð%‰‹AƒÄ [^_]ÐU‰å‹E¹‹€Ð%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
+‹£€Ð%됋‰¡ŒÐ%‰‰ŒÐ%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ŒÐ%„q‹5ŒÐ%‹£ŒÐ%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹€Ð%}è‹Mè됋…Ût‰È;C  +;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5€Ð%ƒ=$Ú%…ôƒìEàPjè3óÿÿ‹€Ð%ƒÄ‹Eà;B  +;B u‹Eä;B~ÇEÜÇEØëK}؋€Ð%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡€Ð%‹@ +EàH‰EØ¡€Ð%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶„Ð%ƒøtƒø…Àt
+ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹Ð%f)Ú·Ò‰Ö5 Ð%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +¤Ð%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ Ð%f‰Ð%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=€Ð%„/Ç$Ú%‹€Ð%‹Eè;B ;B …Œ‹C;BŽ€ƒ=¨u#uƒ=„u#tÿ„u#ÿ¨u#‹€Ð%ë#‹¡ŒÐ%‰‰ŒÐ%‰€Ð%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè +;EèűB;Eì~ă=¨u#uƒ=ˆu#tÿˆu#ÿ +¨u#¶„Ð%ƒøt"ƒø …Àt +ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹Ð%f)Ú·Ò‰Ö5 Ð%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á +¤Ð%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ Ð%f‰Ð%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
+¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹€Ð%‹Mè;J 
+;J u;B~ÇEäÇEàëJ]à‹€Ð%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡€Ð%‹@ +EèH‰EࡀÐ%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇ$Ú%ë +‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹€Ð%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£€Ð%»ë‹‰¡ŒÐ%‰‰ŒÐ%ƒ=$Ú%…ƒ=€Ð%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹€Ð%ƒÄ‹Eð;B  +;B u‹Eô;B~ÇEìÇEèëJ]è‹€Ð%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡€Ð%‹@ +EðH‰E血Ð%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼ˆó#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º u#@£u#1ÛfŒÓü¡”Ð%ƒøtèùòÿÿëè6ùÿÿ°
+º îì¨t ¸@Pè–ÿÿÿf¡˜u#f9žu#t f£žu#ÿ-šu#ƒ=”u#t‹”u#ÿÓf©f¡ffaωöU‰å‹EØf£žu#f£˜u#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;žu#t f£žu#ÿ-šu#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
+‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
+‰…ÿtÇ@ƒ}t ‹BÁà
+‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡Xs#]ÉöU‰å]ÍvU‰åSƒì‹Xs#誃ì SèÅMÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=Js#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèJs#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
+ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹`v#fÇD
+8Ƃev#îƂdv#f‰
+Áèf‰D
+]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
+¤u#ë7fƒùw<·Éƒé¸Óà
+¥u#¢¥u#º¡î<ÿu ¤u#©uƒÈ¢¤u#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"¤u#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"¥u#¢¥u#º¡î ¤u#©t%û¢¤u#º!î]ÉöU‰å¿˜u#]ÃU‰åƒì‹Ef£˜u#˜PèWüÿÿƒÄÉÐU‰å¿˜u#]ÃU‰åƒì‹E‰Âf£˜u#ƒ=¨u#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹°u#ºðu#‰öµÇèô"Çèô"Fƒþ~åƒì EÈPèÅèºÇ€`&!Q#‹EÈ£„`&¶¬u#£ˆ`&ƒÄ‹EУ`&‹EÔ£”`&‹EØ£˜`&h‘ö"jè£ýÿÿƒÄh›ö"jè”ýÿÿƒÄh¥ö"jè…ýÿÿƒÄh¬ö"jèvýÿÿƒÄh³ö"jègýÿÿƒÄhºö"jèXýÿÿƒÄhÁö"jèIýÿÿƒÄh÷"jè:ýÿÿƒÄhÈö"jè+ýÿÿƒÄhÏö"j èýÿÿƒÄhÖö"j
+è +ýÿÿƒÄhÝö"j èþüÿÿƒÄhäö"j èïüÿÿƒÄhëö"j +èàüÿÿƒÄhòö"jèÑüÿÿƒÄhùö"jèÂüÿÿƒÄh÷"jè³üÿÿƒÄhÀõ"jAè¤üÿÿƒÄhÈõ"jBè•üÿÿƒÄhÐõ"jCè†üÿÿƒÄhØõ"jDèwüÿÿƒÄhàõ"jEèhüÿÿƒÄhèõ"jFèYüÿÿƒÄhðõ"jGèJüÿÿƒÄhøõ"jpè;üÿÿƒÄhö"jqè,üÿÿƒÄhö"jrèüÿÿƒÄhö"jsèüÿÿƒÄhö"jtèÿûÿÿƒÄh ö"juèðûÿÿƒÄh(ö"jvèáûÿÿƒÄh0ö"jwèÒûÿÿf +ô_&€¾ƒÄvÀÅàÛ%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿`&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=„`&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•ðu#]ÉöU‰å‹U‹E ‰•°u#]ÉöU‰åƒìhQ#è
+è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƬu#Ûã¹âþfÇ®u#ZZÝ=®u#¹âþf¡®u#<u+Ù=®u#¹âþf¡®u#f%?fƒø?uƬu#Ƭu#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
+ë(`¸ ë `¸ ë`¸ +ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…°u#ÿÓ[° ƒûrº îº îf¡˜u#f;žu#t f£žu#ÿ-šu#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
+ëI¸ ëB¸ ë;¸ +ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=Js#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…ðu#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿0v#È·À-yƒÀÁø9ÂtU¿0v#@ÀÝ4ÅLÜ%›È·À-yƒÀÁøf£0v#¿50v#¿À`&4v4ö4õLÜ%¹üó¥Ý%À`&^_]ÉöU‰å¿0v#]ÃU‰åWVSƒì(ŠM¡4v#Áà ˜€ f¶.a&f£Šó#f¶-a&f£Œó#€ù t%€ù €ù„óé‰ö€ù
+„#é‰öfƒŠó#·Šó#;0a&Œ½fÇŠó#·Œó#¡4a&H9Â…¿¡0a&H‰Eì‰Uèf¾,a&Áâf‰Uò¡4v#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯0a&Èf‹]òf‰FA;Mì~çé)‰öfLjó#·Šó#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰ˆó#f¡ˆó#f£Šó#éævfÇŠó#·Œó#¡4a&H9Â…¾¡0a&H‰Eà‰UÜf¾,a&Áâf‰Uæ¡4v#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯0a&Èf‹]æf‰FA;Mà~çé%‰öfÿ +Šó#·Šó#·Œó#¯0a&ÂÆS fÿŠó#éõ‰ö·Šó#·Œó#¯0a&Ј CfÿŠó#·Šó#;0a&Ž¿fÇŠó#·Œó#¡4a&H9Â…š¡0a&H‰EԉUÐf¾,a&Áâf‰UÚ¡4v#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯0a&Èf‹]Úf‰FA;MÔ~çëfÿŒó#·5Šó#·=Œó#‰øf¯0a&f‰EΡ4v#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ.a&‰ø¢-a&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯0a&f‰Eò¡4v#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢.a&‰úˆ-a&ƒÄ[^_]ÍvU‰åS¹Ô°
+‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡4v#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯0a&È·G‰ð¯0a&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯0a&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡0a&H‰Eð‹4a&K‰]ìf¾,a&Áàf‰Eê¡4v#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯0a&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰0a&¶„@£4a&¶„ÿ ¢,a&¶P¢.a&¶Q¢-a&¶`¢ó#¶a¢Žó#Ç8v#Ç4v#]ÃU‰åWVSƒì .a&¢P -a&¢Q¶ÀP¶.a&PèŠýÿÿ¶Žó#¶5ó#ƒÄ¹Ô°
+‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £8v#¹Ô° +‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹4v#Áâ» ó#¶.a&‰¹Àó#¶-a&‰
+µŠ¢.a&Š
+¢-a&‰54v#[^]ÃU‰å¡8v#]ÉöU‰å¡4v#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯0a&¡4v#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢-a&ŠE¢.a&ƒÄeô[^_]ÍvU‰åWVSƒì ¡0a&H‰Eð‹=4a&Of¾,a&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯0a&¡4v#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ-a&Æ.a&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯0a&¡4v#Áà ÂU”€ ˆ
+ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯0a&¡4v#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯0a&¡4v#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh<Q#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuhàó#èX‰ÃÇ$àó#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuhàõ#謉ÃÇ$àõ#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë +¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
+tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
+AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
+A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
+ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…>#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë +vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
+VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäj
+VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë +vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} +ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
+ÿu èb
+‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
+ÿu è
+‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
+ÇEàÇEоƒè%ƒøS‡çÿ$…P?#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
+VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
+ëBƒ}àt&ƒ}àƒ}àt
+ë"ƒ}àt
+ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
+W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
+WèW‹}ðOÇEÔƒÄë
+vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… @#‰öƒû…8ƒìEìPj
+ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhHQ#Wè&÷ÿÿ‰ÇƒÄ EìPj
+WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhUQ#Wè¶öÿÿ‰ÇƒÄ EìPj
+됃ìh`Q#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä +ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhxQ#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
+B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} +‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
+ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèñðþÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
+‰ö¾ëA€90túŠƒè0< w(ÝàA#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/ÝàA#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
+¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝàA#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4ÝàA#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}ÝàA#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
+¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
+¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E <v#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
+¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝèA#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHݘQ#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾݘQ#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
+SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
+Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5ðA#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
+vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ Q#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿܨQ#Ü +ðA#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
+Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
+Dž„þÿÿ‹•€þÿÿ9U}
+Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
+‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝøA#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?ݘQ#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙݘQ#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf +? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh°Q#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh´Q#Qè çÿÿƒÄ¸ë‰ö…Étƒìh¹Q#QèçÿÿƒÄ¸ÉÃU‰åƒì¸à÷#ƒ=Hv#tÿHv#ÉÃU‰å‹E£Hv#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=Lv#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•B#ÝØÇEغ¾Q#ƒøc~ºÃQ#‰UÜÇEðÇEôƒ=Lv#„}ƒì EØP誃ąÀ…uƒ=Lv#…YƒìjhÉQ#éëvÝØÇEغÝQ#ƒøc~ºâQ#‰UÜÇEðÇEôƒ=Lv#„ƒì EØPè>ƒÄ…À… ƒ=Lv#…íƒìjhèQ#év‰]à‰uäÝ]èÇEغüQ#ƒøc~ºR#‰UÜÇEðÇEôƒ=Lv#„žƒì EØPè˃ąÀ…–ƒ=Lv#…zƒìjh R#é ÝØÇEغR#ƒøc~º$R#‰U܃=Lv#uÇEðàÇEôÿÿïGé¸ +¡@v#‹Dv#‰Eð‰Uôé¡ +‰öÝØÇEغ²S#ƒøc~º¸S#‰U܃=Lv#uÇEðàÇEôÿÿïGéh +¡@v#‹Dv#‰Eð‰UôéQ +‰öÝØÇEغ+R#ƒøc~º/R#‰U܃=Lv#uÇEðàÇEôÿÿïGé +¡@v#‹Dv#‰Eð‰Uôé +‰öÝØÇEغ+R#ƒøc~º/R#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ·L#ƒøc~º4R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„óƒì EØPè ƒÄ…À…ëƒ=Lv#…σìjh8R#éaÝØÇEغ·L#ƒøc~º4R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„gƒì EØP蔃ąÀ…_ƒ=Lv#…Cƒìjh8R#éÕ +ÝØÇEغxL#ƒøc~ºJR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„Û +ƒì EØPèƒÄ…À…Ó +ƒ=Lv#…· +ƒìjhNR#éI +ÝØÇEغxL#ƒøc~ºJR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„O +ƒì EØPè| +ƒÄ…À…G +ƒ=Lv#…+ +ƒìjhNR#é½ ÝØÇEغ`R#ƒøc~ºcR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„à ƒì EØPèð ƒÄ…À…» ƒ=Lv#…Ÿ ƒìjhgR#é1 ÝØÇEغ`R#ƒøc~ºcR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„7 ƒì EØPèd ƒÄ…À…/ ƒ=Lv#… ƒìjhgR#é¥ ÝØÇEغyR#ƒøc~º€R#‰U܃=Lv#uÇEðàÇEôÿÿïGéP ¡@v#‹Dv#‰Eð‰Uôé9 ‰öÝØÇEغyR#ƒøc~º€R#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=Lv#…= ƒìjhˆR#éÏ
+vÝØÇEغœR#ƒøc~º R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„å ƒì EØPè ƒÄ…À…Ë
+ƒ=Lv#…¯
+ƒìjh¥R#éA
+ÝØÇEغœR#ƒøc~º R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„G
+ƒì EØPèt
+ƒÄ…À…?
+ƒ=Lv#…#
+ƒìjh¶R#éµ ÝØÇEغÉR#ƒøc~ºÏR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„Íƒì EØPèè ƒÄ…À…³ ƒ=Lv#…— ƒìjhÖR#é) ÝØÇEغÉR#ƒøc~ºÏR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„/ ƒì EØPè\ ƒÄ…À…' ƒ=Lv#… ƒìjhéR#靐ÝØÇEغþR#ƒøc~ºS#‰UÜÇEðÇEôƒ=Lv#… ƒì EØPèòƒÄ…À…½ƒìjhS#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغþR#ƒøc~ºS#‰U܃=Lv#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ +hT#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡@v#‹Dv#‰Eð‰Uô‰]ЉuÔÝEÐÜ +hT#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡@v#‹Dv#ò€‰Eð‰UôéòvÝØÇEغþR#ƒøc~ºS#‰UÜÇEðÇEôéÁ‰öÝØÇEغþR#ƒøc~ºS#‰U܃=Lv#uÇEðÇEôë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„ãƒì EØPèƒÄ…À…Ûƒ=Lv#…¿ƒìjhS#éQÝØÇEغþR#ƒøc~ºS#‰U܃=Lv#uÇEðÇEôëÇEðÇEôøƒ=Lv#„`ƒì EØP荃ąÀ…Xƒ=Lv#…<ƒìj h@T#éΉöÇEغ9S#ƒøc~º>S#‰U܃=Lv#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ +@v#‹Dv#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغDS#ƒøc~ºIS#‰U܃=Lv#uÇEðÇEôëÇEðÇEôøƒ=Lv#„Lƒì EØPèyƒÄ…À…Dƒ=Lv#…(ƒìjhOS#麉öÇEغcS#ƒøc~ºhS#‰U܃=Lv#uÝ]ðëÝØÇEðÇEôøƒ=Lv#„Òƒì EØPèÿƒÄ…À…ʃ=Lv#…®ƒìjhnS#é@ÝØÇEغƒS#ƒøc~ºS#‰UÜÇEðÇEôøƒ=Lv#„iƒì EØP薃ąÀ…aƒ=Lv#…Eƒìjh˜S#é׍vÝØÇEغ±S#ƒøc~º·S#‰UÜÇEðÇEôøƒ=Lv#„ýƒì EØPè*ƒÄ…À…õƒ=Lv#…Ùƒìjh¾S#ékvÝØÇEغÓS#ƒøc~ºÙS#‰UÜÇEðÇEôøƒ=Lv#„‘ƒì EØP较ąÀ…‰ƒ=Lv#…mƒìjhàS#éÿvÇEغÓS#ƒøc~ºÙS#‰UÜÜ5pT#Ý]ðƒ=Lv#„,ƒì EØPèYƒÄ…À…$ƒ=Lv#…ƒìjhõS#隉öÇEغT#ƒøc~ºT#‰U܋ +@v#‹Dv#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغT#ƒøc~ºT#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=Lv#…jé|vÝØÇEغT#ƒøcŽ•ºT#鋍vÝØÇEغ·L#ƒøc~uº4R#ën‰öÝØÇEغ+T#ƒøc~Yº.T#ëR‰öÝØÇEغxL#ƒøc~=ºJR#ë6‰öÝØÇEغ2T#ƒøc~!º5T#ë‰öÝØÇEغ`R#ƒøc~ºcR#‰UÜÇEðÇEôƒ=Lv#„¯ƒì EØPèʃąÀ…•ƒ=Lv#…‹ƒìjÿuÜjè«îÿÿƒÄ jhT#jèšîÿÿƒÄëfÝØÇEغzR#ƒøc~ºR#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغzR#ƒøc~ºR#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#„‰ƒì EØP趃Ä…À…ƒ=Lv#uiƒìjh‰R#jè™íÿÿƒÄëSÇEغþR#ƒøc~ºS#‰UÜÝ]ðƒ=Lv#ÿt ƒ=Lv#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhxT#h‚T#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hxT#hT#è` ƒÄöCtƒìjahxT#hÀT#èC ƒÄöC tƒìjbhxT#hU#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhxT#h¡T#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh0U#h;U#èX ƒÄ‹F ;Cv‹F;C sƒìjmh0U#h`U#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLhU#h•U#èÙ
+ƒÄ…ÿuƒìjMhU#hžU#è¾
+ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUhU#hàU#è€
+ƒÄƒ~t‹F;F rƒìjUhU#h@V#è[
+ƒÄ‹F +F9FvƒìjUhU#h€V#è9
+ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^hU#hÀV#èø ƒÄöCtƒìj_hU#hW#èÛ ƒÄƒ;t9wƒìj`hU#h@W#è» ƒÄ;^ rƒìjahU#h¶U#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
+v‹‹Uð‰9~sƒìjwhU#hÍU#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThiW#h•U#èۃă} uƒìjUhiW#hžU#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hiW#hàU#舃ăt‹G;G rƒìj[hiW#h@V#ècƒÄ‹G +G9Gvƒìj[hiW#h€V#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷ÃtƒìjkhiW#hÀV#èèƒÄöCtƒìjlhiW#hW#è˃ă;t9wƒìjmhiW#h@W#諃Ä;_ rƒìjnhiW#h¶U#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hiW#htW#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hiW#h W#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
+‹Uè‹‹M쉋E 9Gsƒìh´hiW#hÍU#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShÒW#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh`X#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;FsƒìjahäW#hàU#袃ă~t‹F;F rƒìjahäW#h@V#è}ƒÄ‹F +F9FvƒìjahäW#h€V#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh X#è—ËÿÿƒÄ ÷ÃtƒìjihäW#hÀV#èƒÄöCtƒìjjhäW#hàX#èóƒÄƒ{wƒìjkhäW#hëW#èփă;t9wƒìjlhäW#h@W#趃Ä;^ rƒìjmhäW#h¶U#蚃Ä{‹…Û…BÿÿÿƒìWhX#èäÊÿÿƒÄ9~tƒìjshäW#hX#è`ƒÄ‹6…ö…cþÿÿƒì h2X#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh{T#h•U#è ƒÄ…ÛuƒìjOh{T#hY#èñƒÄƒ}uƒìjPh{T#hžU#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh{T#hY#螃ă{uƒ{t‹C;CsƒìjYh{T#hàU#èsƒÄƒ{t‹C;C rƒìjYh{T#h@V#èNƒÄ‹C +C9CvƒìjYh{T#h€V#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh{T#h€V#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh{T#h@Y#諃ąöt8‹U:9ðr.9ðtƒìjuh{T#h€Y#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
+‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h¦Y#hàU#蠃ă~t‹F;F rƒìj]h¦Y#h@V#è{ƒÄ‹F +F9Fvƒìj]h¦Y#h€V#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh¦Y#hÀV#è$ƒÄöCtƒìjeh¦Y#hàX#èƒÄƒ{wƒìjfh¦Y#hëW#èêƒÄƒ;t9wƒìjgh¦Y#h@W#èʃÄ;^ rƒìjhh¦Y#h¶U#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh¦Y#hX#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuhÀY#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuhø#è…ÈÿÿƒÄhø#ÿ5 $jSVh@Z#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Œ$jÿuÿu ÿuhZ#èƒÄ ÉÉöU‰åƒì E Pÿuhü#èÈÿÿƒÄ jjh¸<#è<ÿÿƒÄhü#h£Z#èŠÅÿÿÇ$Mè–ÿÿƒÄÉÐU‰åƒìhü#h€Z#ècÅÿÿƒÄÉÉöU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸ÁZ#됸ÆZ#됸ÊZ#됸ÐZ#됸‘K#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjè8›ÿÿƒÄ ÿuìÿuèhàZ#èQÅÿÿƒÄ÷EtN¾;5$sA¿À$vƒì µ‹;¶BP·BPRVh [#è +ÅÿÿƒÄ‹;VÿP ƒÄF;5$rÇ÷Etƒì hûZ#èáÄÿÿè”ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöh#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#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#t#ˆ#ô#´#4##ˆ#0#0#„#0##0#l#0#0#Œ#0#Ô#0#0# # #ô
+#ô
+#ô
+#ô
+#ô
+#l
+#ô
+#x
+#€
+#ô
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+#ô
+# #4 #ô
+#ô
+#ô
+#`
+#4 #ô
+#ô
+#T
+#ô
+#`
+#ô
+#ô
+#ô
+#ô
+#,
+#ô
+#„ #ô
+#ô
+#È ## # # # # #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #„ #€ +#€ +#€ +#ô +#„ # # #è +# #ô +# # # # # # #ô # # # +#$@$@d#Ð#<#¬#ü#L#œ#Ì#X #ä #p!#ü!#ˆ"###d##ì##x$#%#%#&#&#¬'#Ü'#h(#ì(#|)#*#x*#ä*#P+#¼+# ,#l,#°,#Ô,#ð,# -#(-#D-#Ä-#<.#Ä.#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#d#Ð#<#¬#ü#L#œ#Ì#X #ä #p!#ü!#ˆ"###d##ì##x$#%#%#&#&#¬'#Ü'#h(#ì(#|)#*#x*#ä*#P+#¼+# ,#l,#°,#Ô,#ð,# -#(-#D-#Ä-#<.#Ä.#T1: started, sending a message
+T2: value = %d, receiving a message
+T2: received message: length=%ld, prio=%d, text=°%s°, notify...
+T2: mq_notify returns errno %d
+T2: 1 sec. reached, sending another message and creating T3 and T4,
+T3: received message: length=%ld, prio=%d, text=°%s°
+T3: 2 sec. reached, sending 5 messages
+T3: mq_send1 returns errno %d
+T3: mq_send2 returns errno %d
+T3: mq_send3 returns errno %d
+T3: mq_send4 returns errno %d
+T3: mq_send5 returns errno %d
+T4: AAAARRRRGGGHHH!!! killed by someone...
+T4: received message: length=%ld, prio=%d, text=°%s°
+Signal %d code=%s value=%d task=%d time=%ldusec
+main: mq_open returns errno %d
+main: mq_notify returns errno %d
+main: created mq, creating T1...
+main: waiting t= 3.5 sec., then kill T4...
+Donald DuckT1: mq_send returns errno %d
+T1: ending...
+T2: waiting t = 1 sec.
+Mickey MouseT2: mq_send returns errno %d
+T2: ending...
+T3: waiting a message...
+T3: waiting t = 1.5 sec.
+GoofyÛMinniePlutoRocker DuckOncle ScroodgeT3: ending...
+T4: waiting t = 2.2 sec.
+TimerOthermqmain: ending...
+Error during Keyboard Initialization!!!Ctrl-C pressed!
+KeybPortKeyTasktask_create
+scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
+The system tick must be less than 55 mSec!Abort detected
+Code : %u
+Too many scheduling levels!!!
+Too many resource levels!!!
+debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
+Signal number %d...
+with value : %d
+POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
+MainPOSIX_register_level
+ alloco descrittore %d %d
+ lev=%d
+POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
+
+Panic!!! can't create main task...
+dummy PID: %d
+Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
+
+Panic!!! can't create dummy task...
+Entro in dummy_register_level
+Port des :
+Free port des : %d
+%d %s vt: %d pn: %d
+%d pd: %d vt: %d pn: %d Resources owned by the tasks:
+%-4dPI_register_module
+PI module
+PC priority of the tasks:
+%-4ldPC_register_module
+PC moduleTR %x
+SS:SP %x:%lx
+Stack0 : %x:%lx
+Stack1 : %x:%lx
+Stack2 : %x:%lx
+CS : %x DS : %x
+Descriptor [%x] InfoNo more Descriptors...
+%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
+2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
+ABORT %d !!!LL Time Panic!!!
+time.cError! File:%s Line:%d %sOne-shot timer selected...
+Periodic timer selected...
+Unhandled Exc or Int occured!!!
+32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ +Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
+asinasinfasin: DOMAIN error
+atan2atan2fatan2: DOMAIN error
+hypothypotfexpexpfy0fy0: DOMAIN error
+y1fy1: DOMAIN error
+ynynfyn: DOMAIN error
+lgammalgammaflgamma: SING error
+loglogflog: SING error
+log: DOMAIN error
+log10log10flog10: SING error
+log10: DOMAIN error
+powpowfpow(0,0): DOMAIN error
+pow(0,neg): DOMAIN error
+sinhsinhfsqrtsqrtfsqrt: DOMAIN error
+fmodfmodffmod: DOMAIN error
+remainderremainderfremainder: DOMAIN error
+acoshacoshfacosh: DOMAIN error
+atanhatanhfatanh: DOMAIN error
+atanh: SING error
+scalbscalbfj0j0f: TLOSS error
+j1j1fjnjnfneg**non-integral: DOMAIN error
+à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
+dump.cnode->size >= sizeof(*node) free_check=%08lx
+reg->free == free_checklmm_dump done
+ region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
+ node %p-%08lx size=%08lx next=%p
+(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
+assertion %s failed in %s at line %i (task:%i_%i)
+MAGIC assertion failed in %s at line %i (task:%i_%i): %s
+KERNEL PANIC (sys_panic_stub): %s
+KERNEL PANIC (sys_panic): %s
+FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
+< Memory Dump >
+< Level %d : %s Code: %d Version: %d >
+8Œÿÿ’ÏÿÿšÏÿHk#ÿ`v#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   + +1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#hs#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-K#&K#K#K#K#
+K#K#üJ#¨•"°•"°•"SP#FP#8P#'P# P#öO#æO#ÒO#ÃO#³O#¦O#‘O#€O#fO#ZO#³O#GO#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš‡Q#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€ä=!>#€>H )Hk#È[ /Pv#àf5`v#àfØê :àf‚Cbx|Þ~I
\ No newline at end of file
/branches/pj/pse51/ptest6
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/pj/pse51/ptest6.c
===================================================================
--- branches/pj/pse51/ptest6.c (nonexistent)
+++ branches/pj/pse51/ptest6.c (revision 1085)
@@ -0,0 +1,300 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ptest6.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:47 $
+ ------------
+
+ Posix test 6:
+
+ message queues
+
+ main thread:
+ set a sigevent to sigev_thread on a mailbox (that creates thread 2)
+ creates thread 1
+ waits t=3.5 sec.
+ pthread_cancel(T4)
+
+ thread 1:
+ send a msg to the mailbox (the event fires and thread 2 is created)
+
+ thread 2:
+ receive the msg sent by thread 1
+ set the event to a signal
+ creates thread 3 and 4
+ waits t = 1 sec
+ send another msg
+
+ thread 3:
+ receive the msg sent by 2 (it blocks!)
+ waits t = 2 sec
+ send 5 msgs (with different priorities!!!
+
+ thread 4:
+ receives 5 msgs every 0.5 sec.
+ then receive another message that never will arrive...
+
+ non standard function used:
+ cprintf
+ sys_gettime
+ keyboard stuffs
+ sys_end
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <mqueue.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+struct sigevent ev25, evtask;
+pthread_attr_t task_attr;
+struct sched_param task_param;
+mqd_t mq;
+pthread_t T1,T2,T3,T4,T5;
+
+#define MESSAGE_LENGTH 100
+
+void *t1(void *arg)
+{
+ cprintf("T1: started, sending a message\n");
+ if (mq_send(mq,"Donald Duck",12,1))
+ { cprintf("T1: mq_send returns errno %d\n",errno); return 0; }
+
+ cprintf("T1: ending...\n");
+ return 0;
+}
+
+void *t4(void *arg);
+void *t3(void *arg);
+
+void t2(union sigval value)
+{
+ ssize_t x;
+ char buf[MESSAGE_LENGTH];
+ int prio;
+
+ cprintf("T2: value = %d, receiving a message\n", value.sival_int);
+
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+
+ cprintf("T2: received message: length=%ld, prio=%d, text=°%s°, notify...\n",
+ x,prio,buf);
+
+ if (mq_notify(mq, &ev25))
+ { cprintf("T2: mq_notify returns errno %d\n",errno); sys_end(); }
+
+ cprintf("T2: waiting t = 1 sec.\n");
+ while (sys_gettime(NULL)<1000000);
+ cprintf("T2: 1 sec. reached, sending another message and creating T3 and T4, \n");
+
+ if (mq_send(mq,"Mickey Mouse",13,1))
+ { cprintf("T2: mq_send returns errno %d\n",errno); sys_end(); }
+
+ pthread_create(&T3, NULL, t3, NULL);
+ pthread_create(&T4, NULL, t4, NULL);
+
+ cprintf("T2: ending...\n");
+}
+
+void *t3(void *arg)
+{
+ ssize_t x;
+ char buf[MESSAGE_LENGTH];
+ int prio;
+
+ cprintf("T3: waiting a message...\n");
+
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+
+ // mickey mouse
+ cprintf("T3: received message: length=%ld, prio=%d, text=°%s°\n",
+ x,prio,buf);
+
+ cprintf("T3: waiting t = 1.5 sec.\n");
+ while (sys_gettime(NULL)<1500000);
+ cprintf("T3: 2 sec. reached, sending 5 messages\n");
+
+ if (mq_send(mq,"Goofy",6,1))
+ { cprintf("T3: mq_send1 returns errno %d\n",errno); sys_end(); }
+ cprintf("Û");
+
+ if (mq_send(mq,"Minnie",7,1))
+ { cprintf("T3: mq_send2 returns errno %d\n",errno); sys_end(); }
+ cprintf("Û");
+
+ if (mq_send(mq,"Pluto",6,2)) // NB: different priority!!!
+ { cprintf("T3: mq_send3 returns errno %d\n",errno); sys_end(); }
+ cprintf("Û");
+
+ if (mq_send(mq,"Rocker Duck",12,2)) // NB: different priority!!!
+ { cprintf("T3: mq_send4 returns errno %d\n",errno); sys_end(); }
+ cprintf("Û");
+
+ if (mq_send(mq,"Oncle Scroodge",15,2)) // NB: different priority!!!
+ { cprintf("T3: mq_send5 returns errno %d\n",errno); sys_end(); }
+ cprintf("Û");
+
+ cprintf("T3: ending...\n");
+
+ return 0;
+}
+
+void t4exit(void *arg)
+{
+ cprintf("T4: AAAARRRRGGGHHH!!! killed by someone...\n");
+}
+
+void *t4(void *arg)
+{
+ ssize_t x;
+ char buf[MESSAGE_LENGTH];
+ int prio;
+
+ cprintf("T4: waiting t = 2.2 sec.\n");
+
+ while (sys_gettime(NULL)<2200000);
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+
+ while (sys_gettime(NULL)<2400000);
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+ while (sys_gettime(NULL)<2600000);
+
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+ while (sys_gettime(NULL)<2800000);
+
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+ while (sys_gettime(NULL)<3000000);
+
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+
+ pthread_cleanup_push(t4exit,NULL);
+ x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
+ cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
+ pthread_cleanup_pop(0);
+
+ return 0;
+}
+
+void signal_handler(int signo, siginfo_t *info, void *extra)
+{
+ cprintf("Signal %d code=%s value=%d task=%d time=%ldusec\n",
+ info->si_signo,
+ (info->si_code == SI_TIMER) ? "Timer" : "Other",
+ info->si_value.sival_int,
+ info->si_task,
+ sys_gettime(NULL));
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+int main(int argc, char **argv)
+{
+// int err;
+ struct sigaction sig_act;
+ struct mq_attr attr;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ sig_act.sa_sigaction = (void *) signal_handler;
+ sig_act.sa_flags = SA_SIGINFO;
+ sigemptyset(&sig_act.sa_mask);
+ sigaction(25, &sig_act, NULL);
+
+ // set ev25, evtask
+ ev25.sigev_notify = SIGEV_SIGNAL;
+ ev25.sigev_signo = 25;
+ ev25.sigev_value.sival_int = 555;
+
+ evtask.sigev_notify = SIGEV_THREAD;
+ evtask.sigev_value.sival_int = 777;
+ evtask.sigev_notify_function = t2;
+ evtask.sigev_notify_attributes = &task_attr;
+
+ // set pthread attributes
+ pthread_attr_init(&task_attr);
+ pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
+ pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
+ task_param.sched_priority = 10;
+ pthread_attr_setschedparam(&task_attr, &task_param);
+
+ // set mqueue attributes
+ attr.mq_flags = 0;
+ attr.mq_maxmsg = 3;
+ attr.mq_msgsize = MESSAGE_LENGTH;
+
+ // create the message queue
+ if ((mq = mq_open("mq", O_CREAT|O_RDWR, 0, &attr)) == -1)
+ { cprintf("main: mq_open returns errno %d\n",errno); return 0; }
+
+ if (mq_notify(mq, &evtask))
+ { cprintf("main: mq_notify returns errno %d\n",errno); return 0; }
+
+ cprintf("main: created mq, creating T1...\n");
+
+ pthread_create(&T1, NULL, t1, NULL);
+
+ cprintf("main: waiting t= 3.5 sec., then kill T4...\n");
+
+ while (sys_gettime(NULL)<3500000);
+
+ pthread_cancel(T4);
+
+ cprintf("main: ending...\n");
+
+ return 0;
+}
Index: branches/pj/pse51/makefile
===================================================================
--- branches/pj/pse51/makefile (nonexistent)
+++ branches/pj/pse51/makefile (revision 1085)
@@ -0,0 +1,25 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS+= ptest1 ptest2 ptest3 ptest4 ptest5 ptest6
+
+include $(BASE)/config/example.mk
+
+ptest1:
+ make -f $(SUBMAKE) APP=ptest1 INIT= OTHEROBJS="pinit.o"
+ptest2:
+ make -f $(SUBMAKE) APP=ptest2 INIT= OTHEROBJS="pinit.o"
+ptest3:
+ make -f $(SUBMAKE) APP=ptest3 INIT= OTHEROBJS="pinit.o"
+ptest4:
+ make -f $(SUBMAKE) APP=ptest4 INIT= OTHEROBJS="pinit.o"
+ptest5:
+ make -f $(SUBMAKE) APP=ptest5 INIT= OTHEROBJS="pinit.o"
+ptest6:
+ make -f $(SUBMAKE) APP=ptest6 INIT= OTHEROBJS="pinit.o"
Index: branches/pj/mix/initfile.c
===================================================================
--- branches/pj/mix/initfile.c (nonexistent)
+++ branches/pj/mix/initfile.c (revision 1085)
@@ -0,0 +1,124 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+
+ System initialization file
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBS (Costant Bandwidth Server) level
+ a Dummy level
+
+ It can accept these task models:
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ SOFT_TASK_MODEL (met, period) at level 1
+ NRT_TASK_MODEL at level 2
+
+ This file is similar to the configuration of kernel/init/hartik3.c
+
+ TICK is set to 0 (one-shot timer is used)
+*/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+void read_file();
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(0);
+ CBS_register_level(0, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ read_file();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ keyb_def_map(kparms,itaMap);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/mix/mix.dat
===================================================================
--- branches/pj/mix/mix.dat (nonexistent)
+++ branches/pj/mix/mix.dat (revision 1085)
@@ -0,0 +1,12 @@
+TASK NAME PERIOD WCET
+------------------------------------------
+task1 watch: 1000000 200
+task2 tasto: 2000 200
+task3 palla: 2000 200
+task4 mosca: 20000 200
+task5 infor: 20000 300
+task6 ruota: 5000 400
+task7 color: 2000 200
+task8 pendo: 5000 400
+------------------------------------------
+
Index: branches/pj/mix/makefile
===================================================================
--- branches/pj/mix/makefile (nonexistent)
+++ branches/pj/mix/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= mix
+
+include $(BASE)/config/example.mk
+
+mix:
+ make -f $(SUBMAKE) APP=mix INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
Index: branches/pj/mix/readme
===================================================================
--- branches/pj/mix/readme (nonexistent)
+++ branches/pj/mix/readme (revision 1085)
@@ -0,0 +1,7 @@
+MIX
+---
+
+This simple applications is a pout-pourri of simple graphic tasks
+that does different things with different timing constraints...
+
+Paolo
\ No newline at end of file
Index: branches/pj/mix/mix.c
===================================================================
--- branches/pj/mix/mix.c (nonexistent)
+++ branches/pj/mix/mix.c (revision 1085)
@@ -0,0 +1,762 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: mix.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Giorgio Buttazzo and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*--------------------------------------------------------------*/
+/* DEMO with 9 INDEPENDENT TASKS */
+/*--------------------------------------------------------------*/
+
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define PIG 3.1415
+#define ESC 27 /* ASCII code for ESCAPE */
+#define DURATA 10000 /* counter duration in tick */
+
+#define LW 200 /* window length */
+#define HW 150 /* window height */
+#define HLOAD 30 /* Y level for the max load */
+#define LLOAD (HW-HLOAD-5) /* length for the max load */
+
+#define XWL 10 /* left X of LEFT window */
+#define XWM 220 /* left X of MIDDLE window */
+#define XWR 430 /* left X RIGHT window */
+
+#define YWH 5 /* top Y of HIGH window */
+#define YWM 165 /* top Y of MIDDLE window */
+#define YWL 325 /* top Y of LOW window */
+
+char fbuf[1000]; /* buffer for reading a file */
+int flen; /* file length */
+int fine = 0; /* ending flag */
+
+sem_t mx_mat, mx_grf; /* mutex semaphores */
+
+int wcet[10]; /* array of task wcets */
+int period[10]; /* array of task periods */
+double load(long); /* load evaluation function */
+
+PID ptas;
+char talk[5][25] = {" SHARK Demonstration ",
+ " RETIS Lab -- Scuola ",
+ " Superiore S. Anna ",
+ " HARD REAL-TIME DEMO ",
+ " June 5, 2001 "};
+
+/*------------------------------------------------------*/
+/* file reading */
+/*------------------------------------------------------*/
+
+void read_file(void)
+{
+ int err;
+ DOS_FILE *fp;
+
+ fp = DOS_fopen("mix.dat","r");
+
+ if (!fp) {
+ err = DOS_error();
+ cprintf("Error %d opening myfile.txt...\n", err);
+ flen = 0;
+ return;
+ }
+
+ flen = DOS_fread(&fbuf, 1, 1000, fp);
+ cprintf("Read %d bytes from file\n", flen);
+ DOS_fclose(fp);
+}
+
+/*------------------------------------------------------*/
+/* get data from buffer */
+/*------------------------------------------------------*/
+
+void get_par(void)
+{
+ int x = 0;
+ int i;
+
+ for (i=1; i<=8; i++) {
+ while ((fbuf[x] != ':') && (x < flen)) x++;
+ x++;
+ sscanf(&fbuf[x], "%d %d", &period[i], &wcet[i]);
+ cprintf("per[%d] = %d, wcet[%d] = %d\n",
+ i, period[i], i, wcet[i]);
+ }
+}
+
+/*--------------------------------------------------------------*/
+
+void byebye()
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/*--------------------------------------------------------------*/
+
+void finish1()
+{
+ sys_end();
+}
+
+/*--------------------------------------------------------------*/
+
+void finish2()
+{
+ fine = 1;
+}
+
+/****************************************************************/
+/* PROCESSO OROLOGIO */
+/****************************************************************/
+
+#define LLAN 40 /* length of watch stick */
+
+TASK watch()
+{
+ int x0 = XWL + LW/2;
+ int y0 = YWH + HW/2;
+ int grad;
+ int xg, yg;
+ int xt, yt, d;
+ int sec, min;
+ char s[5];
+ double rad, x, y;
+
+ xg = x0;
+ yg = y0 - LLAN;
+ xt = XWL + 78;
+ yt = YWH + 12;
+ sec = min = 0;
+
+ while (1) {
+ sec = (sec + 1) % 60;
+ if (sec == 0) min++;
+ grad = 90 - sec * 6;
+ rad = (double)grad * PIG / 180.;
+
+ sem_wait(&mx_mat);
+ x = (double)x0 + (double)LLAN * cos(rad);
+ y = (double)y0 - (double)LLAN * sin(rad);
+ sem_post(&mx_mat);
+
+ sem_wait(&mx_grf);
+ grx_line(x0, y0, xg, yg, 0);
+ sem_post(&mx_grf);
+
+ xg = x;
+ yg = y;
+
+ sem_wait(&mx_grf);
+ grx_line(x0, y0, xg, yg, 14);
+ sem_post(&mx_grf);
+
+ sem_wait(&mx_grf);
+ grx_text("0 :0 ", xt, yt, 14, 0);
+ sprintf(s, "%d", min);
+ grx_text(s, xt+8, yt, 14, 0);
+ sprintf(s, "%d", sec);
+ if (sec > 9) d = 24; else d = 32;
+ grx_text(s, xt+d, yt, 14, 0);
+ sem_post(&mx_grf);
+
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO DI RIEMPIMENTO */
+/****************************************************************/
+
+#define CIMA (YWH+5) /* fondo del recipiente */
+#define FONDO (YWH+HW-5) /* cima del recipiente */
+#define LREC (XWM+75) /* lato sinistro recipiente */
+#define DREC 50 /* diametro del recipiente */
+
+TASK tasto()
+{
+ int x, y;
+ int x0; /* coord. sinistra recipiente */
+ int col, cliq, bkg;
+ int i;
+ int liv; /* livello del liquido */
+
+ cliq = 9;
+ bkg = 14;
+ x0 = LREC;
+ x = x0 + DREC/2;
+ y = CIMA;
+ liv = FONDO;
+
+ while (1) {
+
+ col = cliq;
+ for (i=0; i<2; i++) { /* disegna goccia */
+ while (y < liv) {
+ sem_wait(&mx_grf);
+ grx_plot(x,y,col);
+ sem_post(&mx_grf);
+ y++;
+ }
+ y = CIMA;
+ col = bkg;
+ }
+
+ liv--;
+ sem_wait(&mx_grf);
+ grx_line(x0+1, liv, x0+DREC-1, liv, cliq);
+ sem_post(&mx_grf);
+
+ if (liv <= CIMA+1) { /* swap colors */
+ i = bkg; bkg = cliq; cliq = i;
+ liv = FONDO;
+ }
+
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+
+void kboar()
+{
+ task_activate(ptas);
+}
+
+/****************************************************************/
+/* PROCESSO PALLA */
+/****************************************************************/
+
+#define VMIN 11. /* velocit… minima per suono */
+#define LP 3 /* lato della pallina */
+
+TASK palla()
+{
+ int ox, oy; /* vecchia posizione pallina */
+ int x0; /* posizione iniziale pallina */
+ int xmin, xmax;
+ int base, top;
+ int xg, yg; /* coordinate grafiche pallina */
+ double x, y; /* coordinate pallina */
+ double G = 9.8;
+ double vx, vy, v0; /* velocit… della pallina */
+ double t, tx; /* variabile temporale */
+ double dt; /* incremento temporale */
+ double arg; /* variabile di appoggio */
+
+ xmin = XWR+LP+1;
+ xmax = XWR+LW-LP-1;
+ base = YWH+HW-LP-1;
+ top = HW-10-LP;
+ x = ox = x0 = xmin;
+ y = oy = top;
+ arg = 2.*G*(double)top;
+ vy = v0 = sqrt(arg);
+ vx = 15.;
+ tx = 0.0;
+ t = vy / G;
+ dt = .02;
+
+ while (1) {
+ x = x0 + vx*tx;
+ y = base - vy*t + .5*G*t*t;
+ if (y >= base) {
+ t = 0.0;
+ vy = v0;
+ y = base - vy*t + .5*G*t*t;
+ }
+ if (x >= xmax) {
+ tx = 0.0;
+ x0 = xmax;
+ vx = -vx;
+ x = x0 + vx*tx;
+ }
+ if (x <= xmin) {
+ tx = 0.0;
+ x0 = xmin;
+ vx = -vx;
+ x = x0 + vx*tx;
+ }
+ xg = x; yg = y;
+ sem_wait(&mx_grf);
+ grx_disc(ox,oy,LP,0);
+ grx_disc(xg,yg,LP,10);
+ sem_post(&mx_grf);
+ oy = yg; ox = xg;
+ t += dt;
+ tx += dt;
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO MOSCA */
+/****************************************************************/
+
+TASK mosca()
+{
+ int x, y, Ax, Ay, h;
+ int x0, y0, tet;
+ int xmax,ymax;
+ double A, B;
+ double r;
+ double rnd;
+
+ xmax = LW/2-1; ymax = HW/2-1;
+ x = 0; y = 0; tet = 0;
+ x0 = XWL+LW/2; y0 = YWM+HW/2;
+ A = 5.; B = 30.;
+
+ while (1) {
+
+ rnd = (rand()%100)/100.; /* rnd = [0,1] */
+ h = (2. * B * rnd) - B; /* h = [-B,B] */
+ tet = tet + h;
+
+ if (tet > 360) tet = tet - 360;
+ if (tet < 0) tet = tet + 360;
+ r = tet * PIG / 180.;
+
+ sem_wait(&mx_mat);
+ Ax = (double)(A * cos(r));
+ Ay = (double)(A * sin(r));
+ sem_post(&mx_mat);
+ x = x + Ax;
+ y = y + Ay;
+
+ if ((x >= xmax) || (x <= -xmax) ||
+ (y >= ymax) || (y <= -ymax)) {
+ x = x - Ax;
+ y = y - Ay;
+ tet = tet - 180;
+ if (tet > 360) tet = tet - 360;
+ if (tet < 0) tet = tet + 360;
+ r = tet * PIG / 180.;
+ sem_wait(&mx_mat);
+ Ax = (double)(A * cos(r));
+ Ay = (double)(A * sin(r));
+ sem_post(&mx_mat);
+ x = x + Ax;
+ y = y + Ay;
+ }
+ sem_wait(&mx_grf);
+ grx_plot(x+x0, y+y0, 10);
+ sem_post(&mx_grf);
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO INFORMAZIONI */
+/****************************************************************/
+
+TASK infor()
+{
+ char s[2];
+ int x, y;
+ int r;
+ int i = 0;
+ int leng;
+ int col = 0;
+
+ r = 0;
+ x = XWM + 16;
+ y = YWM + 40;
+ s[1] = 0;
+
+ leng = 0;
+ while (talk[0][leng] != 0) leng++;
+
+ while (1) {
+ s[0] = talk[r][i];
+ sem_wait(&mx_grf);
+ grx_text(s,x+i*8,y+r*8,col+10,1);
+ sem_post(&mx_grf);
+ i++;
+ if (i == leng) {
+ i = 0;
+ r = (r + 1) % 5;
+ if (r == 0) col = (col + 1) % 6;
+ }
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO RUOTA */
+/****************************************************************/
+
+TASK ruota()
+{
+ int x0 = XWR + LW/2;
+ int y0 = YWM + HW/2;
+ int grad = 90;
+ int xg, yg;
+ double rad, x, y;
+
+ xg = x0;
+ yg = y0 + LLAN;
+
+ while (1) {
+
+ rad = (double)grad * PIG / 180.;
+
+ sem_wait(&mx_mat);
+ x = (double)x0 + (double)LLAN * cos(rad);
+ y = (double)y0 + (double)LLAN * sin(rad);
+ sem_post(&mx_mat);
+
+ sem_wait(&mx_grf);
+ grx_disc(xg, yg, 4, 0);
+ sem_post(&mx_grf);
+
+ xg = x; yg = y;
+
+ sem_wait(&mx_grf);
+ grx_disc(xg, yg, 4, 13);
+ sem_post(&mx_grf);
+
+ grad = (grad + 1) % 360;
+
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO COLORI */
+/****************************************************************/
+
+TASK color()
+{
+ int xx0 = XWL+5;
+ int yy0 = YWL+5;
+ int n, col;
+ int x, y;
+
+ x = 0; y = 0;
+
+ while (1) {
+ n = 19. * ((rand()%100)/100.);
+ x = xx0 + n * 10;
+ n = 14. * ((rand()%100)/100.);
+ y = yy0 + n * 10;
+ col = 16. * ((rand()%100)/100.);
+
+ /* xg = xx0 + x;
+ yg = yy0 + y;
+ x = (x + 10)%(LW-10);
+ y = (y + 10)%(HW-10);
+ */
+ sem_wait(&mx_grf);
+ grx_box(x, y, x+9, y+9, col);
+ sem_post(&mx_grf);
+
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* PROCESSO PENDOLO */
+/****************************************************************/
+
+TASK pendo()
+{
+ int x0 = XWM+LW/2;
+ int y0 = YWL+10;
+ int xg, yg;
+ int col = 11;
+ double x, y, teta;
+ double v, a, dt;
+ double g, l;
+
+ g = 9.8;
+ l = 80.;
+ dt = 0.1;
+ teta = 40. * PIG / 180.;
+ v = 0.;
+ sem_wait(&mx_mat);
+ x = l * sin((double)teta);
+ y = l * cos((double)teta);
+ a = -(g/l) * sin((double)teta);
+ sem_post(&mx_mat);
+ xg = x0 + x;
+ yg = y0 + y;
+
+ while (1) {
+
+ v += a * dt;
+ teta += v * dt;
+ sem_wait(&mx_mat);
+ x = l * sin((double)teta);
+ y = l * cos((double)teta);
+ a = -(g/l) * sin((double)teta);
+ sem_post(&mx_mat);
+
+ sem_wait(&mx_grf);
+ grx_line(x0, y0, xg, yg, 0);
+ grx_circle(xg, yg, 5, 0);
+ grx_disc(xg, yg, 4, 0);
+ sem_post(&mx_grf);
+
+ xg = x0+x; yg = y0+y;
+
+ sem_wait(&mx_grf);
+ grx_line(x0, y0, xg, yg, col);
+ grx_circle(xg, yg, 5, col+2);
+ grx_disc(xg, yg, 4, col+1);
+ sem_post(&mx_grf);
+
+ task_endcycle();
+ }
+}
+
+/****************************** gener ******************************/
+
+TASK gener()
+{
+ HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL am;
+ PID pid;
+
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[1]);
+ hard_task_def_mit (m, period[1]);
+ hard_task_def_usemath (m);
+ pid = task_create("watch", watch, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ soft_task_default_model(am);
+ soft_task_def_met (am, wcet[2]);
+ soft_task_def_period (am, period[2]);
+ soft_task_def_aperiodic(am);
+ soft_task_def_usemath (am);
+ ptas = task_create("tasto", tasto, &am, NULL);
+ task_activate(ptas);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[3]);
+ hard_task_def_mit (m, period[3]);
+ hard_task_def_usemath (m);
+ pid = task_create("palla", palla, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[4]);
+ hard_task_def_mit (m, period[4]);
+ hard_task_def_usemath (m);
+ pid = task_create("mosca", mosca, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[5]);
+ hard_task_def_mit (m, period[5]);
+ hard_task_def_usemath (m);
+ pid = task_create("infor", infor, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[6]);
+ hard_task_def_mit (m, period[6]);
+ hard_task_def_usemath (m);
+ pid = task_create("ruota", ruota, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[7]);
+ hard_task_def_mit (m, period[7]);
+ hard_task_def_usemath (m);
+ pid = task_create("color", color, &m, NULL);
+ task_activate(pid);
+ keyb_getch(BLOCK);
+ //---------------------------------------------
+ hard_task_default_model(m);
+ hard_task_def_wcet (m, wcet[8]);
+ hard_task_def_mit (m, period[8]);
+ hard_task_def_usemath (m);
+ pid = task_create("pendo", pendo, &m, NULL);
+ task_activate(pid);
+ //---------------------------------------------
+
+ return NULL;
+}
+
+/****************************** MAIN ******************************/
+
+TASK main()
+{
+ char s[20]; /* carattere letto da tastiera */
+ int x0, y0;
+ int x, y;
+ TIME t1, count; /* contatori valutazione carico */
+ double car; /* valore del carico corrente */
+ TIME seme;
+ PID pid;
+ NRT_TASK_MODEL m2;
+ KEY_EVT eva, evx, evs;
+
+ set_exchandler_grx();
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* set the keyboard handler */
+ eva.ascii = 'a';
+ eva.scan = KEY_A;
+ eva.flag = 0;
+ keyb_hook(eva,kboar);
+
+ evx.ascii = 'x';
+ evx.scan = KEY_X;
+ evx.flag = ALTL_BIT;
+ keyb_hook(evx,finish1);
+
+ evs.ascii = ESC;
+ evs.scan = KEY_ESC;
+ evs.flag = 0;
+ keyb_hook(evs,finish2);
+
+ sem_init(&mx_mat,0,1);
+ sem_init(&mx_grf,0,1);
+
+ seme = sys_gettime(NULL);
+ srand(seme);
+
+ get_par();
+ keyb_getch(BLOCK);
+
+ grx_init();
+ grx_open(640, 480, 8);
+
+ grx_rect(XWL,YWH,XWL+LW,YWH+HW,14);
+ grx_rect(XWM,YWH,XWM+LW,YWH+HW,14);
+ grx_rect(XWR,YWH,XWR+LW,YWH+HW,14);
+
+ grx_rect(XWL,YWM,XWL+LW,YWM+HW,14);
+ grx_rect(XWM,YWM,XWM+LW,YWM+HW,14);
+ grx_rect(XWR,YWM,XWR+LW,YWM+HW,14);
+
+ grx_rect(XWL,YWL,XWL+LW,YWL+HW,14);
+ grx_rect(XWM,YWL,XWM+LW,YWL+HW,14);
+ grx_rect(XWR,YWL,XWR+LW,YWL+HW,14);
+
+ x0 = XWL + LW/2;
+ y0 = YWH + HW/2;
+ grx_circle(x0, y0, LLAN+3, 12);
+ grx_rect(XWL+74, YWH+7, XWL+120, YWH+22, 12);
+
+ x0 = LREC;
+ grx_line(x0, CIMA, x0, FONDO, 15);
+ grx_line(x0+DREC, CIMA, x0+DREC, FONDO, 15);
+ grx_line(x0, FONDO, x0+DREC, FONDO, 15);
+ grx_box(x0+1, CIMA, x0+DREC-1, FONDO-1, 14);
+ grx_text("Press A", XWM+16, YWH+48, 10, 0);
+ grx_text("to fill", XWM+16, YWH+64, 10, 0);
+
+ grx_text("Press:", XWM+18, YWM+HW-50, 10, 0);
+ grx_text("ESC to exit", XWM+18, YWM+HW-40, 10, 0);
+ grx_text("SPACE to create", XWM+18, YWM+HW-30, 10, 0);
+
+ x0 = XWR + LW/2;
+ y0 = YWM + HW/2;
+ grx_circle(x0, y0, LLAN/3, 14);
+ grx_disc(x0, y0, LLAN/3-1, 12);
+
+ x0 = XWR+5;
+ y0 = YWL+HW-5;
+ grx_line(x0, YWL+HLOAD, x0+LW-10, YWL+HLOAD, 12);
+ grx_text("SYSTEM WORKLOAD:", x0+5, YWL+HLOAD-10, 10, 0);
+
+ count = 0;
+ t1 = sys_gettime(NULL);
+ do count++; while (sys_gettime(NULL) < (t1 + DURATA));
+
+ nrt_task_default_model(m2);
+ pid = task_create("gener", gener, &m2, NULL);
+ task_activate(pid);
+
+ x = 0;
+ while (!fine) {
+ car = load(count);
+ y = (double)LLOAD*car;
+ sem_wait(&mx_grf);
+ grx_line(x0+x, y0-LLOAD+1, x0+x, y0, 0);
+ grx_line(x0+x, y0-y, x0+x, y0, 15);
+ grx_text(" ", x0+LW-60, YWL+HLOAD-10, 0, 0);
+ sprintf(s, "%.3f", car);
+ grx_text(s, x0+LW-50, YWL+HLOAD-10, 15, 0);
+ sem_post(&mx_grf);
+ x = (x + 1) % (LW-10);
+ }
+
+ sys_end();
+
+ return NULL;
+}
+
+/****************************************************************/
+
+double load(long n)
+{
+ TIME i, t1;
+ double carico;
+
+ i = 0;
+ t1 = sys_gettime(NULL);
+ do i++; while (sys_gettime(NULL) < (t1 + DURATA));
+ carico = 1. - (double)i / (double)n;
+ return(carico);
+}
+
+/****************************************************************/
Index: branches/pj/cbs_ft/cbs_ft.c
===================================================================
--- branches/pj/cbs_ft/cbs_ft.c (nonexistent)
+++ branches/pj/cbs_ft/cbs_ft.c (revision 1085)
@@ -0,0 +1,1009 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@hartik.sssup.it>
+ *
+ * Authors : Marco Caccamo and Paolo Gai
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: cbs_ft.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the server CBS_FT
+
+ Read CBS_FT.h for further details.
+
+**/
+
+/*
+ * Copyright (C) 2000 Marco Caccamo and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include "cbs_ft.h"
+
+/*+ 4 debug purposes +*/
+#undef CBS_FT_TEST
+
+#ifdef TESTG
+#include "drivers/glib.h"
+TIME x,oldx;
+extern TIME starttime;
+#endif
+
+
+
+
+/*+ Status used in the level +*/
+#define CBS_FT_IDLE APER_STATUS_BASE /*+ waiting the activation +*/
+#define CBS_FT_ZOMBIE APER_STATUS_BASE+1 /*+ waiting the period end +*/
+#define CBS_FT_DELAY APER_STATUS_BASE+2 /*+ waiting the delay end +*/
+
+/* structure of an element of the capacity queue */
+struct cap_queue {
+ int cap;
+ struct timespec dead;
+ struct cap_queue *next;
+};
+
+/*+ the level redefinition for the CBS_FT level +*/
+typedef struct {
+ level_des l; /*+ the standard level descriptor +*/
+
+ /* The wcet are stored in the task descriptor, but we need
+ an array for the deadlines. We can't use the timespec_priority
+ field because it is used by the master level!!!...
+ Notice that however the use of the timespec_priority field
+ does not cause any problem... */
+
+ struct timespec cbs_ft_dline[MAX_PROC]; /*+ CBS_FT deadlines +*/
+
+
+ TIME period[MAX_PROC]; /*+ CBS_FT activation period +*/
+
+
+ int maxcap[MAX_PROC]; /* amount of capacity reserved to a primary+backup
+ couple */
+
+ PID backup[MAX_PROC]; /* Backup task pointers, defined for primary tasks */
+
+ char CP[MAX_PROC]; /* checkpoint flag */
+
+ char P_or_B[MAX_PROC]; /* Type of task: PRIMARY or BACKUP */
+
+
+ struct timespec reactivation_time[MAX_PROC];
+ /*+ the time at witch the reactivation timer is post +*/
+
+ int reactivation_timer[MAX_PROC]; /*+ the recativation timer +*/
+
+ struct cap_queue *queue; /* pointer to the spare capacity queue */
+
+ int flags; /*+ the init flags... +*/
+
+ bandwidth_t U; /*+ the used bandwidth by the server +*/
+
+ int idle; /* the idle flag... */
+
+ struct timespec start_idle; /*gives the start time of the last idle period */
+
+ LEVEL scheduling_level;
+
+} CBS_FT_level_des;
+
+
+
+/* insert a capacity in the queue capacity ordering by deadline */
+
+static int c_insert(struct timespec dead, int cap, struct cap_queue **que,
+ PID p)
+{
+ struct cap_queue *prev, *n, *new;
+
+ prev = NULL;
+ n = *que;
+
+ while ((n != NULL) &&
+ !TIMESPEC_A_LT_B(&dead, &n->dead)) {
+ prev = n;
+ n = n->next;
+ }
+
+
+ new = (struct cap_queue *)kern_alloc(sizeof(struct cap_queue));
+ if (new == NULL) {
+ kern_printf("\nNew cash_queue element failed\n");
+ kern_raise(XUNVALID_TASK, p);
+ return -1;
+ }
+ new->next = NULL;
+ new->cap = cap;
+ new->dead = dead;
+
+ if (prev != NULL)
+ prev->next = new;
+ else
+ *que = new;
+
+ if (n != NULL)
+ new->next = n;
+ return 0;
+
+}
+
+/* extract the first element from the capacity queue */
+
+int c_extractfirst(struct cap_queue **que)
+{
+ struct cap_queue *p = *que;
+
+
+ if (*que == NULL) return(-1);
+
+ *que = (*que)->next;
+
+ kern_free(p, sizeof(struct cap_queue));
+ return(1);
+}
+
+/* read data of the first element from the capacity queue */
+
+static void c_readfirst(struct timespec *d, int *c, struct cap_queue *que)
+{
+ *d = que->dead;
+ *c = que->cap;
+}
+
+/* write data of the first element from the capacity queue */
+
+static void c_writefirst(struct timespec dead, int cap, struct cap_queue *que)
+{
+ que->dead = dead;
+ que->cap = cap;
+}
+
+
+static void CBS_FT_activation(CBS_FT_level_des *lev,
+ PID p,
+ struct timespec *acttime)
+{
+ JOB_TASK_MODEL job;
+ int capacity;
+
+ /* This rule is used when we recharge the budget at initial task activation
+ and each time a new task instance must be activated */
+
+ if (TIMESPEC_A_GT_B(acttime, &lev->cbs_ft_dline[p])) {
+ /* we modify the deadline ... */
+ TIMESPEC_ASSIGN(&lev->cbs_ft_dline[p], acttime);
+ }
+
+
+ if (proc_table[p].avail_time > 0)
+ proc_table[p].avail_time = 0;
+
+
+
+ /* A spare capacity is inserted in the capacity queue!! */
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
+ capacity = lev->maxcap[p] - proc_table[ lev->backup[p] ].wcet;
+ c_insert(lev->cbs_ft_dline[p], capacity, &lev->queue, p);
+
+
+ /* it exploits available capacities from the capacity queue */
+ while (proc_table[p].avail_time < proc_table[p].wcet &&
+ lev->queue != NULL) {
+ struct timespec dead;
+ int cap, delta;
+ delta = proc_table[p].wcet - proc_table[p].avail_time;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
+ if (cap > delta) {
+ proc_table[p].avail_time += delta;
+ c_writefirst(dead, cap - delta, lev->queue);
+ }
+ else {
+ proc_table[p].avail_time += cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ else
+ break;
+ }
+
+ /* If the budget is still less than 0, an exception is raised */
+ if (proc_table[p].avail_time <= 0) {
+ kern_printf("\nnegative value for the budget!\n");
+ kern_raise(XUNVALID_TASK, p);
+ return;
+ }
+
+
+
+ /*if (p==6)
+ kern_printf("(act_time:%d dead:%d av_time:%d)\n",
+ acttime->tv_sec*1000000+
+ acttime->tv_nsec/1000,
+ lev->cbs_ft_dline[p].tv_sec*1000000+
+ lev->cbs_ft_dline[p].tv_nsec/1000,
+ proc_table[p].avail_time); */
+
+
+
+
+
+
+#ifdef TESTG
+ if (starttime && p == 3) {
+ oldx = x;
+ x = ((lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
+ // kern_printf("(a%d)",lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000);
+ if (oldx > x) sys_end();
+ if (x<640)
+ grx_plot(x, 15, 8);
+ }
+#endif
+
+ /* and, finally, we reinsert the task in the master level */
+ job_task_default_model(job, lev->cbs_ft_dline[p]);
+ job_task_def_yesexc(job);
+ level_table[ lev->scheduling_level ]->
+ guest_create(lev->scheduling_level, p, (TASK_MODEL *)&job);
+ level_table[ lev->scheduling_level ]->
+ guest_activate(lev->scheduling_level, p);
+}
+
+
+static char *CBS_FT_status_to_a(WORD status)
+{
+ if (status < MODULE_STATUS_BASE)
+ return status_to_a(status);
+
+ switch (status) {
+ case CBS_FT_IDLE : return "CBS_FT_Idle";
+ case CBS_FT_ZOMBIE : return "CBS_FT_Zombie";
+ case CBS_FT_DELAY : return "CBS_FT_Delay";
+ default : return "CBS_FT_Unknown";
+ }
+}
+
+
+
+
+/* this is the periodic reactivation of the task... */
+static void CBS_FT_timer_reactivate(void *par)
+{
+ PID p = (PID) par;
+ CBS_FT_level_des *lev;
+
+ lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
+
+ if (proc_table[p].status == CBS_FT_IDLE) {
+ /* the task has finished the current activation and must be
+ reactivated */
+
+ /* request_time represents the time of the last instance release!! */
+ TIMESPEC_ASSIGN(&proc_table[p].request_time, &lev->reactivation_time[p]);
+
+ /* If idle=1, then we have to discharge the capacities stored in
+ the capacity queue up to the length of the idle interval */
+ if (lev->idle == 1) {
+ TIME interval;
+ struct timespec delta;
+ lev->idle = 0;
+ SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
+ /* length of the idle interval expressed in usec! */
+ interval = TIMESPEC2NANOSEC(&delta) / 1000;
+
+ /* it discharges the available capacities from the capacity queue */
+ while (interval > 0 && lev->queue != NULL) {
+ struct timespec dead;
+ int cap;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (cap > interval) {
+ c_writefirst(dead, cap - interval, lev->queue);
+ interval = 0;
+ }
+ else {
+ interval -= cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ }
+
+ CBS_FT_activation(lev,p,&lev->reactivation_time[p]);
+
+
+ /* Set the reactivation timer */
+ TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
+ lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
+ CBS_FT_timer_reactivate,
+ (void *)p);
+ event_need_reschedule();
+ }
+ else {
+ /* this situation cannot occur */
+ kern_printf("\nTrying to reactivate a primary task which is not IDLE!\n");
+ kern_raise(XUNVALID_TASK,p);
+ }
+}
+
+
+
+static void CBS_FT_avail_time_check(CBS_FT_level_des *lev, PID p)
+{
+
+ /*+ if the capacity became negative the remaining computation time
+ is diminuished.... +*/
+ /* if (p==4)
+ kern_printf("(old dead:%d av_time:%d)\n",
+ lev->cbs_ft_dline[p].tv_sec*1000000+
+ lev->cbs_ft_dline[p].tv_nsec/1000,
+ proc_table[p].avail_time); */
+
+
+ int newcap = proc_table[p].wcet / 100 * 30;
+ if (newcap <= 0)
+ newcap = proc_table[p].wcet;
+ /* it exploits available capacities from the capacity queue */
+ while (proc_table[p].avail_time < newcap
+ && lev->queue != NULL) {
+ struct timespec dead;
+ int cap, delta;
+ delta = newcap - proc_table[p].avail_time;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
+ if (cap > delta) {
+ proc_table[p].avail_time += delta;
+ c_writefirst(dead, cap - delta, lev->queue);
+ }
+ else {
+ proc_table[p].avail_time += cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ else
+ break;
+ }
+
+
+
+ /*if (p==6)
+ kern_printf("(ATC dead:%d av_time:%d)\n",
+ lev->cbs_ft_dline[p].tv_sec*1000000+
+ lev->cbs_ft_dline[p].tv_nsec/1000,
+ proc_table[p].avail_time); */
+
+
+
+ /* if the budget is still empty, the backup task must be woken up.
+ Remind that a short chunk of primary will go ahead executing
+ before the task switch occurs */
+ if (proc_table[p].avail_time <= 0) {
+ lev->CP[p] = 1;
+ proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
+ }
+
+
+ /*if (p==6)
+ kern_printf("(ATC1 dead:%d av_time:%d)\n",
+ lev->cbs_ft_dline[p].tv_sec*1000000+
+ lev->cbs_ft_dline[p].tv_nsec/1000,
+ proc_table[p].avail_time); */
+
+
+
+}
+
+
+/*+ this function is called when a killed or ended task reach the
+ period end +*/
+static void CBS_FT_timer_zombie(void *par)
+{
+ PID p = (PID) par;
+ CBS_FT_level_des *lev;
+
+ lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
+
+ /* we finally put the task in the FREE status */
+ proc_table[p].status = FREE;
+ q_insertfirst(p,&freedesc);
+
+
+ /* and free the allocated bandwidth */
+ lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
+}
+
+
+static int CBS_FT_level_accept_task_model(LEVEL l, TASK_MODEL *m)
+{
+
+ if (m->pclass == FT_PCLASS || m->pclass ==
+ (FT_PCLASS | l)) {
+ FT_TASK_MODEL *f = (FT_TASK_MODEL *) m;
+
+ //kern_printf("accept :FAULT TOLERANT TASK found!!!!!!\n"); */
+ if (f->type == PRIMARY && f->execP > 0 && f->budget < (int)f->period
+ && f->backup != NIL) return 0;
+ if (f->type == BACKUP && f->wcetB > 0)
+ return 0;
+ }
+ return -1;
+}
+
+
+
+static int CBS_FT_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
+{
+ return -1;
+}
+
+static char *onoff(int i)
+{
+ if (i)
+ return "On ";
+ else
+ return "Off";
+}
+
+static void CBS_FT_level_status(LEVEL l)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+ PID p;
+
+ kern_printf("On-line guarantee : %s\n",
+ onoff(lev->flags & CBS_FT_ENABLE_GUARANTEE));
+ kern_printf("Used Bandwidth : %u/%u\n",
+ lev->U, MAX_BANDWIDTH);
+
+ for (p=0; p<MAX_PROC; p++)
+ if (proc_table[p].task_level == l && proc_table[p].status != FREE )
+ kern_printf("Pid: %2d Name: %10s Period: %9ld Dline: %9ld.%6ld Stat: %s\n",
+ p,
+ proc_table[p].name,
+ lev->period[p],
+ lev->cbs_ft_dline[p].tv_sec,
+ lev->cbs_ft_dline[p].tv_nsec/1000,
+ CBS_FT_status_to_a(proc_table[p].status));
+}
+
+static PID CBS_FT_level_scheduler(LEVEL l)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ /* it stores the actual time and set the IDLE flag in order to handle
+ the capacity queue discharging!!! */
+ lev->idle = 1;
+ ll_gettime(TIME_EXACT, &lev->start_idle);
+
+
+ /* the CBS_FT don't schedule anything...
+ it's an EDF level or similar that do it! */
+ return NIL;
+}
+
+
+/* The on-line guarantee is enabled only if the appropriate flag is set... */
+static int CBS_FT_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ if (lev->flags & CBS_FT_FAILED_GUARANTEE) {
+ *freebandwidth = 0;
+ kern_printf("guarantee :garanzia fallita!!!!!!\n");
+ return 0;
+ }
+ else if (*freebandwidth >= lev->U) {
+ *freebandwidth -= lev->U;
+ return 1;
+ }
+ else {
+ kern_printf("guarantee :garanzia fallita per mancanza di banda!!!!!!\n");
+ kern_printf("freeband: %d request band: %d", *freebandwidth, lev->U);
+ return 0;
+ }
+}
+
+
+static int CBS_FT_task_create(LEVEL l, PID p, TASK_MODEL *m)
+
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ /* if the CBS_FT_task_create is called, then the pclass must be a
+ valid pclass. */
+ FT_TASK_MODEL *s = (FT_TASK_MODEL *)m;
+
+
+
+ /* Enable budget check */
+ proc_table[p].control |= CONTROL_CAP;
+
+ proc_table[p].avail_time = 0;
+ NULL_TIMESPEC(&lev->cbs_ft_dline[p]);
+
+
+ if (s->type == PRIMARY) {
+ proc_table[p].wcet = (int)s->execP;
+ lev->period[p] = s->period;
+ lev->maxcap[p] = s->budget;
+ lev->backup[p] = s->backup;
+ lev->CP[p] = 0;
+ lev->P_or_B[p] = PRIMARY;
+
+ /* update the bandwidth... */
+ if (lev->flags & CBS_FT_ENABLE_GUARANTEE) {
+ bandwidth_t b;
+ b = (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
+
+ /* really update lev->U, checking an overflow... */
+ if (MAX_BANDWIDTH - lev->U > b)
+ lev->U += b;
+ else
+ /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
+ (see EDF.c) */
+ lev->flags |= CBS_FT_FAILED_GUARANTEE;
+ }
+ }
+ else {
+ proc_table[p].wcet = (int)s->wcetB;
+ lev->P_or_B[p] = BACKUP;
+
+ /* Backup tasks are unkillable tasks! */
+ proc_table[p].control |= NO_KILL;
+ }
+
+ return 0; /* OK, also if the task cannot be guaranteed... */
+}
+
+
+static void CBS_FT_task_detach(LEVEL l, PID p)
+{
+ /* the CBS_FT level doesn't introduce any dynamic allocated new field.
+ we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
+ bandwidth */
+
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ if (lev->flags & CBS_FT_FAILED_GUARANTEE)
+ lev->flags &= ~CBS_FT_FAILED_GUARANTEE;
+ else
+ lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
+}
+
+
+static int CBS_FT_task_eligible(LEVEL l, PID p)
+{
+ return 0; /* if the task p is chosen, it is always eligible */
+}
+
+#ifdef __TEST1__
+ extern int testactive;
+ extern struct timespec s_stime[];
+ extern TIME s_curr[];
+ extern TIME s_PID[];
+ extern int useds;
+#endif
+
+static void CBS_FT_task_dispatch(LEVEL l, PID p, int nostop)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+ level_table[ lev->scheduling_level ]->
+ guest_dispatch(lev->scheduling_level,p,nostop);
+
+#ifdef __TEST1__
+ if (testactive)
+ {
+ TIMESPEC_ASSIGN(&s_stime[useds], &schedule_time);
+ s_curr[useds] = proc_table[p].avail_time;
+ s_PID[useds] = p;
+ useds++;
+ }
+#endif
+}
+
+static void CBS_FT_task_epilogue(LEVEL l, PID p)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ /* check if the budget is finished... */
+ if (proc_table[p].avail_time <= 0) {
+
+ /* A backup task cannot ever exhaust its budget! */
+ if (lev->P_or_B[p] == BACKUP) {
+ kern_printf("\nBACKUP wcet violation!\n");
+ kern_raise(XWCET_VIOLATION,p);
+ /* we kill the current activation */
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level, p);
+ return;
+ }
+
+ /* we try to recharge the budget */
+ CBS_FT_avail_time_check(lev, p);
+
+ /* The budget must be greater than 0! */
+ if (proc_table[p].avail_time <= 0) {
+ kern_printf("\nBackup task starting with exhausted budget\n");
+ kern_raise(XUNVALID_TASK, p);
+ lev->CP[p] = 0;
+ /* we kill the current activation */
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level, p);
+ return;
+ }
+ }
+
+ /* the task returns into the ready queue by
+ calling the guest_epilogue... */
+ level_table[ lev->scheduling_level ]->
+ guest_epilogue(lev->scheduling_level,p);
+}
+
+
+static void CBS_FT_task_activate(LEVEL l, PID p)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ ll_gettime(TIME_EXACT, &proc_table[p].request_time);
+
+
+
+ if (lev->P_or_B[p] == BACKUP) {
+ kern_printf("\nTrying to activate a BACKUP task!\n");
+ kern_raise(XUNVALID_TASK, p);
+ }
+ else {
+
+ /* If idle=1, then we have to discharge the capacities stored in
+ the capacity queue up to the length of the idle interval */
+ if (lev->idle == 1) {
+ TIME interval;
+ struct timespec delta;
+ lev->idle = 0;
+ SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
+ /* length of the idle interval expressed in usec! */
+ interval = TIMESPEC2NANOSEC(&delta) / 1000;
+
+ /* it discharge the available capacities from the capacity queue */
+ while (interval > 0 && lev->queue != NULL) {
+ struct timespec dead;
+ int cap;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (cap > interval) {
+ c_writefirst(dead, cap - interval, lev->queue);
+ interval = 0;
+ }
+ else {
+ interval -= cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ }
+
+ CBS_FT_activation(lev, p, &proc_table[p].request_time);
+
+
+ /* Set the reactivation timer */
+ TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
+ lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
+ CBS_FT_timer_reactivate,
+ (void *)p);
+
+ // kern_printf("act : %d %d |",lev->cbs_ft_dline[p].tv_nsec/1000,p);
+ }
+}
+
+
+static void CBS_FT_task_insert(LEVEL l, PID p)
+{
+ printk("CBS_FT_task_insert\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+
+static void CBS_FT_task_extract(LEVEL l, PID p)
+{
+ printk("CBS_FT_task_extract\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+
+static void CBS_FT_task_endcycle(LEVEL l, PID p)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level,p);
+
+
+ proc_table[p].status = CBS_FT_IDLE;
+
+
+ if (lev->P_or_B[p] == PRIMARY) {
+ if (lev->CP[p]) {
+ JOB_TASK_MODEL job;
+
+ /* We have to start the backup task */
+ TIMESPEC_ASSIGN(&lev->cbs_ft_dline[ lev->backup[p] ],
+ &lev->cbs_ft_dline[p]);
+ proc_table[ lev->backup[p] ].avail_time = proc_table[p].avail_time;
+ lev->CP[p] = 0;
+
+ /* and, finally, we insert the backup task in the master level */
+ job_task_default_model(job, lev->cbs_ft_dline[p]);
+ job_task_def_yesexc(job);
+ level_table[ lev->scheduling_level ]->
+ guest_create(lev->scheduling_level, lev->backup[p],
+ (TASK_MODEL *)&job);
+ level_table[ lev->scheduling_level ]->
+ guest_activate(lev->scheduling_level, lev->backup[p]);
+ }
+ else {
+ /* A spare capacity is inserted in the capacity queue!! */
+ proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
+ if (proc_table[p].avail_time > 0) {
+ c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
+ &lev->queue, p);
+ proc_table[p].avail_time = 0;
+ }
+ }
+ }
+ else {
+ /* this branch is for backup tasks:
+ A spare capacity is inserted in the capacity queue!! */
+ if (proc_table[p].avail_time > 0) {
+ c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
+ &lev->queue, p);
+ proc_table[p].avail_time = 0;
+ }
+ }
+}
+
+
+static void CBS_FT_task_end(LEVEL l, PID p)
+{
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+
+ /* A backup task cannot be killed, this behaviour can be modified
+ in a new release */
+ if (lev->P_or_B[p] == BACKUP) {
+ kern_printf("\nKilling a BACKUP task!\n");
+ kern_raise(XUNVALID_TASK, p);
+ return;
+ }
+
+ /* check if the capacity becomes negative... */
+ /* there is a while because if the wcet is << than the system tick
+ we need to postpone the deadline many times */
+ while (proc_table[p].avail_time < 0) {
+ /* the CBS_FT rule for recharging the capacity */
+ proc_table[p].avail_time += lev->maxcap[p];
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
+ }
+
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level,p);
+
+
+ /* we delete the reactivation timer */
+ event_delete(lev->reactivation_timer[p]);
+ lev->reactivation_timer[p] = -1;
+
+
+ /* Finally, we post the zombie event. when the end period is reached,
+ the task descriptor and banwidth are freed */
+ proc_table[p].status = CBS_FT_ZOMBIE;
+ lev->reactivation_timer[p] = kern_event_post(&lev->cbs_ft_dline[p],
+ CBS_FT_timer_zombie,
+ (void *)p);
+}
+
+
+static void CBS_FT_task_sleep(LEVEL l, PID p)
+{
+ printk("CBS_FT_task_sleep\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+
+static void CBS_FT_task_delay(LEVEL l, PID p, TIME usdelay)
+{
+ printk("CBS_FT_task_delay\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+
+static int CBS_FT_guest_create(LEVEL l, PID p, TASK_MODEL *m)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
+
+static void CBS_FT_guest_detach(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_dispatch(LEVEL l, PID p, int nostop)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_epilogue(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_activate(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_insert(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_extract(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_endcycle(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_end(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_sleep(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBS_FT_guest_delay(LEVEL l, PID p,DWORD tickdelay)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+
+
+
+/* Registration functions */
+
+/*+ Registration function:
+ int flags the init flags ... see CBS.h +*/
+void CBS_FT_register_level(int flags, LEVEL master)
+{
+ LEVEL l; /* the level that we register */
+ CBS_FT_level_des *lev; /* for readableness only */
+ PID i; /* a counter */
+
+ printk("CBS_FT_register_level\n");
+
+ /* request an entry in the level_table */
+ l = level_alloc_descriptor();
+
+ printk(" alloco descrittore %d %d\n",l,sizeof(CBS_FT_level_des));
+
+ /* alloc the space needed for the CBS_FT_level_des */
+ lev = (CBS_FT_level_des *)kern_alloc(sizeof(CBS_FT_level_des));
+
+ printk(" lev=%d\n",(int)lev);
+
+ /* update the level_table with the new entry */
+ level_table[l] = (level_des *)lev;
+
+ /* fill the standard descriptor */
+ strncpy(lev->l.level_name, CBS_FT_LEVELNAME, MAX_LEVELNAME);
+ lev->l.level_code = CBS_FT_LEVEL_CODE;
+ lev->l.level_version = CBS_FT_LEVEL_VERSION;
+
+ lev->l.level_accept_task_model = CBS_FT_level_accept_task_model;
+ lev->l.level_accept_guest_model = CBS_FT_level_accept_guest_model;
+ lev->l.level_status = CBS_FT_level_status;
+ lev->l.level_scheduler = CBS_FT_level_scheduler;
+
+ if (flags & CBS_FT_ENABLE_GUARANTEE)
+ lev->l.level_guarantee = CBS_FT_level_guarantee;
+ else
+ lev->l.level_guarantee = NULL;
+
+ lev->l.task_create = CBS_FT_task_create;
+ lev->l.task_detach = CBS_FT_task_detach;
+ lev->l.task_eligible = CBS_FT_task_eligible;
+ lev->l.task_dispatch = CBS_FT_task_dispatch;
+ lev->l.task_epilogue = CBS_FT_task_epilogue;
+ lev->l.task_activate = CBS_FT_task_activate;
+ lev->l.task_insert = CBS_FT_task_insert;
+ lev->l.task_extract = CBS_FT_task_extract;
+ lev->l.task_endcycle = CBS_FT_task_endcycle;
+ lev->l.task_end = CBS_FT_task_end;
+ lev->l.task_sleep = CBS_FT_task_sleep;
+ lev->l.task_delay = CBS_FT_task_delay;
+
+ lev->l.guest_create = CBS_FT_guest_create;
+ lev->l.guest_detach = CBS_FT_guest_detach;
+ lev->l.guest_dispatch = CBS_FT_guest_dispatch;
+ lev->l.guest_epilogue = CBS_FT_guest_epilogue;
+ lev->l.guest_activate = CBS_FT_guest_activate;
+ lev->l.guest_insert = CBS_FT_guest_insert;
+ lev->l.guest_extract = CBS_FT_guest_extract;
+ lev->l.guest_endcycle = CBS_FT_guest_endcycle;
+ lev->l.guest_end = CBS_FT_guest_end;
+ lev->l.guest_sleep = CBS_FT_guest_sleep;
+ lev->l.guest_delay = CBS_FT_guest_delay;
+
+ /* fill the CBS_FT descriptor part */
+ for (i=0; i<MAX_PROC; i++) {
+ NULL_TIMESPEC(&lev->cbs_ft_dline[i]);
+ lev->period[i] = 0;
+ NULL_TIMESPEC(&lev->reactivation_time[i]);
+ lev->reactivation_timer[i] = -1;
+ lev->maxcap[i] = 0;
+ lev->backup[i] = NIL;
+ lev->CP[i] = 0;
+ lev->P_or_B[i] = PRIMARY;
+ }
+
+ lev->U = 0;
+ lev->idle = 0;
+ lev->queue = NULL;
+
+ lev->scheduling_level = master;
+
+ lev->flags = flags & 0x07;
+}
+
+
+
+bandwidth_t CBS_FT_usedbandwidth(LEVEL l)
+{
+
+ CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
+ if (lev->l.level_code == CBS_FT_LEVEL_CODE &&
+ lev->l.level_version == CBS_FT_LEVEL_VERSION)
+ return lev->U;
+ else
+ return 0;
+}
+
+
+
+void CBS_FT_Primary_Abort()
+{
+ PID p;
+ CBS_FT_level_des *lev;
+
+ kern_cli();
+ p = exec_shadow;
+ lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
+ lev->CP[p] = 1;
+ kern_sti();
+}
+
+
+char CBS_FT_Checkpoint()
+{
+ char f;
+ PID p;
+ CBS_FT_level_des *lev;
+
+ kern_cli();
+ p = exec_shadow;
+ lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
+ f = lev->CP[p];
+ kern_sti();
+ return f;
+}
+
Index: branches/pj/cbs_ft/initfile.c
===================================================================
--- branches/pj/cbs_ft/initfile.c (nonexistent)
+++ branches/pj/cbs_ft/initfile.c (revision 1085)
@@ -0,0 +1,112 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@hartik.sssup.it>
+ *
+ * Authors : Marco caccamo and Paolo Gai
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the server CBS_FT
+
+ Read CBS_FT.h for further details.
+
+**/
+
+/*
+ * Copyright (C) 2000 Marco Caccamo and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include <modules/edf.h>
+#include <modules/rr.h>
+#include "cbs_ft.h"
+#include <modules/cbs.h>
+#include <modules/dummy.h>
+#include <drivers/keyb.h>
+#include <modules/hartport.h>
+#include <modules/sem.h>
+#include <modules/cabs.h>
+
+/*+ system tick in us +*/
+#define TICK 300
+#define RRTICK 5000
+
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_FT_register_level(CBS_FT_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+ CABS_register_module();
+
+ // periodic timer
+ return TICK;
+ // one-shot timer
+ // return 0
+}
+
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ HARTPORT_init();
+
+ KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/cbs_ft/cbs_ft.h
===================================================================
--- branches/pj/cbs_ft/cbs_ft.h (nonexistent)
+++ branches/pj/cbs_ft/cbs_ft.h (revision 1085)
@@ -0,0 +1,166 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@hartik.sssup.it>
+ *
+ * Authors : Marco Caccamo and Paolo Gai
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: cbs_ft.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the server CBS_FT
+
+ Read CBS_FT.h for further details.
+
+**/
+
+/*
+ * Copyright (C) 2000 Marco Caccamo and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __CBS_FT__
+#define __CBS_FT__
+
+
+
+#include <ll/string.h>
+#include <kernel/model.h>
+#include <kernel/descr.h>
+#include <kernel/var.h>
+#include <kernel/func.h>
+
+
+
+
+
+
+/*+ flags... +*/
+#define CBS_FT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
+#define CBS_FT_ENABLE_ALL 1
+
+#define CBS_FT_FAILED_GUARANTEE 8 /*+ used in the module, unsettable
+ in EDF_register_level... +*/
+
+
+#define PRIMARY 1
+#define BACKUP 2
+#define FT_PCLASS 0x0700 // Nuova classe di task, quelli fault_tolerant
+
+#define CBS_FT_LEVELNAME "CBSFT base"
+#define CBS_FT_LEVEL_CODE 110
+#define CBS_FT_LEVEL_VERSION 1
+
+
+/* The Fault-Tolerant Task model extends the base task model
+ This model cannot be APERIODIC, only PERIODIC tasks are allowed.
+ A faut-tolerant application is composed by two different tasks (primary and
+ backup). The backup task is characterized by its WCET and its type (BACKUP).
+ The primary task must define the task period, its average execution time
+ (used as sort of prediction in order to recharge the budget using the
+ capacity cash queue!), the budget (budget / period = U that is, the
+ bandwidth assigned to the fault-tolerant application), its type (PRIMARY)
+ and finally the PID of the corresponding backup task. */
+
+typedef struct {
+ TASK_MODEL t;
+
+ TIME wcetB; // WCET of the backup job (BACKUP TASK ONLY)
+
+ TIME execP; // average exec. time of the primary job (PRIMARY TASK ONLY)
+
+ TIME period; // period of the fault-tolerant task (PRIMARY TASK ONLY)
+
+ int budget; // amount of guaranteed capacity (PRIMARY TASK ONLY)
+
+ char type; // PRIMARY or BACKUP
+
+ PID backup; // (PRIMARY TASK ONLY)
+
+} FT_TASK_MODEL;
+
+
+#define ft_task_default_model(m) \
+ task_default_model((m).t,FT_PCLASS), \
+ (m).period = 0, \
+ (m).wcetB = 0, \
+ (m).execP = 0, \
+ (m).budget = 0, \
+ (m).type = BACKUP, \
+ (m).backup = NIL
+
+#define ft_task_def_level(m,l) task_def_level((m).t,l)
+#define ft_task_def_arg(m,a) task_def_arg((m).t,a)
+#define ft_task_def_stack(m,s) task_def_stack((m).t,s)
+#define ft_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
+#define ft_task_def_usemath(m) task_def_usemath((m).t)
+#define ft_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
+#define ft_task_def_group(m,g) task_def_group((m).t,g)
+#define ft_task_def_period(m,o) (m).period = (o)
+#define ft_task_def_budget(m,o) (m).budget = (o)
+#define ft_task_def_backup(m) (m).type = BACKUP
+#define ft_task_def_primary(m) (m).type = PRIMARY
+#define ft_task_def_backup_task(m,b) (m).backup = b
+#define ft_task_def_backup_wcet(m,b) (m).wcetB = b
+#define ft_task_def_primary_exec(m,b) (m).execP = b
+
+/************************************************************************/
+void CBS_FT_register_level(int flags, LEVEL master);
+
+
+bandwidth_t CBS_FT_usedbandwidth(LEVEL l);
+
+
+
+/* This function notifies to a primary task that the task itself has to
+ suspend its execution (the task has to suspend itself with a
+ task_endcycle() */
+char CBS_FT_Checkpoint(void);
+
+
+
+/* This function sets the checkpoint flag! hence, at the next checkpoint,
+ that is:
+
+ if (CBS_FT_Checkpoint()) {
+ task_endcycle();
+ continue;
+ }
+
+ the primary task will suspend itself switching to the backup task */
+void CBS_FT_Primary_Abort(void);
+
+/***************************************************************************/
+
+
+
+
+#endif
Index: branches/pj/cbs_ft/prova.c
===================================================================
--- branches/pj/cbs_ft/prova.c (nonexistent)
+++ branches/pj/cbs_ft/prova.c (revision 1085)
@@ -0,0 +1,429 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@hartik.sssup.it>
+ *
+ * Authors : Marco Caccamo and Paolo Gai
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: prova.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ testcash.c
+ test for the CASH Module, directly derived from Test Number 13 (D)
+
+**/
+
+/*
+ * Copyright (C) 2000 Marco Caccamo and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include <modules/edf.h>
+#include "cbs_ft.h"
+#include <math.h>
+#include <stdlib.h>
+
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+
+#define STAT_Y 9
+
+#define INPUT 0.5
+
+
+
+#define MAX_STAT 10000
+#define RVAL 1
+#define XVAL 2
+#define DVAL 3
+
+
+struct statistic {
+ TIME r_time;
+ TIME ex_time;
+ long dead_post;
+};
+
+
+
+ struct statistic stat[MAX_STAT];
+ TIME val[MAX_STAT];
+
+int n_stat = 0;
+
+TASK hard_aster1p(void)
+{
+ int i;
+ int y = 1;
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'P'; s[1] = 0;
+
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 20000; //+ rand() % 25000;
+ for (j=0; j<load1; j++) {
+ if (CBS_FT_Checkpoint())
+ break;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK hard_aster1b(void)
+{
+ int i;
+ int y = 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'B'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 20000;// + rand()%4000;
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK hard_aster2p(void)
+{
+ int i;
+ int y = 3;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'P'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 20000 + rand() % 20000;
+ for (j=0; j<load1; j++) {
+ if (CBS_FT_Checkpoint())
+ break;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK hard_aster2b(void)
+{
+ int i;
+ int y = 3;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'T'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 20000;
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d",m,s);
+ printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
+ printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d",m,s);
+ printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
+ printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6ld ³ %-6ld ³ %-4d ³ %-7ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld", p, sum/(nact==0 ? 1 : nact), max,
+ nact, curr, last[0], last[1], last[2], last[3], last[4]);
+ kern_sti();
+ i++;
+ }
+ task_endcycle();
+ }
+}
+
+
+void save_stat(struct statistic p[], int n, char *name, int type)
+{
+ DOS_FILE *f;
+ int i;
+ char outstring[500];
+
+
+ for(i = 0; i < 500; i++)
+ outstring[i] = '0';
+
+ f = DOS_fopen(name, "w");
+ if (!f) {
+ cprintf("Cannot open %s!!!", name);
+ goto end1;
+ }
+
+ for(i = 0; i < n; i++) {
+ if (type == RVAL)
+ val[i] = p[i].r_time;
+ if (type == XVAL)
+ val[i] = p[i].ex_time;
+ if (type == DVAL)
+ val[i] = p[i].dead_post;
+ }
+
+ memset(outstring, 0, 300);
+ sprintf(outstring, "%ld \n", (long int)n);
+ cprintf("%s", outstring);
+ DOS_fwrite(outstring, 1, strlen(outstring), f);
+
+ for(i = 0; i < n; i++) {
+ memset(outstring, 0, 300);
+ sprintf(outstring, "%ld %lu\n", (long int)i, val[i]);
+ //cprintf("%s", outstring);
+ DOS_fwrite(outstring, 1, strlen(outstring), f);
+ }
+ DOS_fclose(f);
+end1:cprintf("OK?");
+}
+
+
+void result_save(void *p)
+{
+ save_stat(stat, n_stat, "stat1.tim", RVAL);
+}
+
+
+void fine()
+{
+ ll_abort(666);
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3, p4, p5, p6;
+
+ HARD_TASK_MODEL m;
+ FT_TASK_MODEL ftb;
+ FT_TASK_MODEL ftp;
+
+ // int i;
+ struct timespec fineprg;
+
+
+ //sys_atrunlevel(result_save, NULL, RUNLEVEL_AFTER_EXIT);
+ srand(7);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,500);
+ hard_task_def_mit(m,500000);
+ hard_task_def_periodic(m);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+
+ p1 = task_create("Clock",clock,&m,NULL);
+ if (p1 == -1) {
+ perror("testhd.c(main): Could not create task <Clock> ...");
+ sys_end();
+ }
+
+
+ hard_task_def_wcet(m,500);
+ hard_task_def_periodic(m);
+ hard_task_def_mit(m,100000);
+
+
+ p2 = task_create("JetControl",jetcontrol,&m,NULL);
+ if (p2 == -1) {
+ perror("testhd.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ }
+
+
+ ft_task_default_model(ftb);
+ ft_task_def_usemath(ftb);
+ ft_task_def_backup(ftb);
+ ft_task_def_ctrl_jet(ftb);
+ ft_task_def_backup_wcet(ftb, 7000);
+
+
+
+ p3 = task_create("Hard_aster1b", hard_aster1b, &ftb,NULL);
+ if (p3 == -1) {
+ perror("testhd.c(main): Could not create task <aster1b> ...");
+ sys_end();
+ }
+
+ ft_task_default_model(ftp);
+ ft_task_def_usemath(ftp);
+ ft_task_def_ctrl_jet(ftp);
+ ft_task_def_group(ftp, 1);
+ ft_task_def_period(ftp, 50000);
+ ft_task_def_budget(ftp, 15000);
+ ft_task_def_primary_exec(ftp, 7300);
+ ft_task_def_primary(ftp);
+ ft_task_def_backup_task(ftp, p3);
+
+
+ p4 = task_create("Hard_aster1p", hard_aster1p, &ftp, NULL);
+ if (p4 == -1) {
+ perror("testhd.c(main): Could not create task <aster1p> ...");
+ sys_end();
+ }
+
+
+ ft_task_def_backup_wcet(ftb, 6700);
+
+
+ p5 = task_create("Hard_aster2b", hard_aster2b, &ftb, NULL);
+ if (p5 == -1) {
+ perror("testhd.c(main): Could not create task <aster2b> ...");
+ sys_end();
+ }
+
+
+ ft_task_def_period(ftp, 100000);
+ ft_task_def_budget(ftp, 8000);
+ ft_task_def_primary_exec(ftp, 11000);
+ ft_task_def_backup_task(ftp, p5);
+
+
+ p6 = task_create("Hard_aster2p", hard_aster2p, &ftp, NULL);
+ if (p6 == -1) {
+ perror("testhd.c(main): Could not create task <aster2p> ...");
+ sys_end();
+ }
+
+
+ printf_xy(0,STAT_Y + 15,WHITE,"Hard asteroide PID= %-3d ",p3);
+ printf_xy(0,STAT_Y + 17,WHITE,"Clock PID= %-3d ",p1);
+ printf_xy(0,STAT_Y + 18,WHITE,"JetControl PID= %-3d ",p2);
+
+
+
+ task_nopreempt();
+ fineprg.tv_sec = 10;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/cbs_ft/readme.txt
===================================================================
--- branches/pj/cbs_ft/readme.txt (nonexistent)
+++ branches/pj/cbs_ft/readme.txt (revision 1085)
@@ -0,0 +1,6 @@
+This Example has been made by Marco Caccamo.
+
+There is not a lot of documentation available, so if you have problems please
+send an e-mail to Marco ( http://gandalf.sssup.it/~caccamo/ )
+
+Paolo
Index: branches/pj/cbs_ft/makefile
===================================================================
--- branches/pj/cbs_ft/makefile (nonexistent)
+++ branches/pj/cbs_ft/makefile (revision 1085)
@@ -0,0 +1,17 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= prova
+
+include $(BASE)/config/example.mk
+
+prova:
+ make -f $(SUBMAKE) APP=prova INIT= OTHEROBJS="initfile.o cbs_ft.o" OTHERINCL=
+
+
Index: branches/pj/jumpball/initfil1.c
===================================================================
--- branches/pj/jumpball/initfil1.c (nonexistent)
+++ branches/pj/jumpball/initfil1.c (revision 1085)
@@ -0,0 +1,118 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil1.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+//#define RRTICK 10000
+#define RRTICK 2000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ NOP_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+
+void app_mutex_init(mutex_t *m)
+{
+ PI_mutexattr_t attr;
+
+ PI_mutexattr_default(attr);
+
+ mutex_init(m, &attr);
+}
+
Index: branches/pj/jumpball/initfil2.c
===================================================================
--- branches/pj/jumpball/initfil2.c (nonexistent)
+++ branches/pj/jumpball/initfil2.c (revision 1085)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil2.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/rrsoft.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+//#define RRTICK 10000
+#define RRTICK 2000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ NOP_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+
+void app_mutex_init(mutex_t *m)
+{
+ NOP_mutexattr_t attr;
+
+ NOP_mutexattr_default(attr);
+
+ mutex_init(m, &attr);
+}
+
Index: branches/pj/jumpball/initfile.c
===================================================================
--- branches/pj/jumpball/initfile.c (nonexistent)
+++ branches/pj/jumpball/initfile.c (revision 1085)
@@ -0,0 +1,141 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#define PI
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+
+#ifndef PI
+#include "modules/rrsoft.h"
+#endif
+
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+//#define RRTICK 10000
+#define RRTICK 2000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+#ifdef PI
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+#else
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
+#endif
+
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ NOP_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ HARTPORT_init();
+
+ kern_printf("TIME=%d\n",sys_gettime(NULL));
+ KEYB_init(NULL);
+ kern_printf("TIME=%d\n",sys_gettime(NULL));
+// KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+
+#ifdef PI
+void app_mutex_init(mutex_t *m)
+{
+ PI_mutexattr_t attr;
+
+ PI_mutexattr_default(attr);
+
+ mutex_init(m, &attr);
+}
+#else
+void app_mutex_init(mutex_t *m)
+{
+ NOP_mutexattr_t attr;
+
+ NOP_mutexattr_default(attr);
+
+ mutex_init(m, &attr);
+}
+#endif
Index: branches/pj/jumpball/demo.c
===================================================================
--- branches/pj/jumpball/demo.c (nonexistent)
+++ branches/pj/jumpball/demo.c (revision 1085)
@@ -0,0 +1,252 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: demo.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "demo.h"
+#include <kernel/func.h>
+#include <string.h>
+#include <stdlib.h>
+#include <drivers/keyb.h>
+#include <drivers/glib.h>
+
+/* graphic mutex... */
+mutex_t mutex;
+
+/* useful colors... */
+int white;
+int black;
+int red;
+int gray;
+
+void app_mutex_init(mutex_t *m);
+
+static void version( void )
+{
+ cprintf( "S.Ha.R.K. Pavia Demo 1.0\n" );
+ cprintf( "------------------------\n" );
+ cprintf( "by Paolo Gai 1999-2001\n" );
+ cprintf( " <pj@sssup.it>\n" );
+ cprintf( "------------------------\n" );
+}
+
+int myrand(int x)
+{
+ return rand()%x;
+}
+
+void reverse(char s[])
+{
+ int c, i, j;
+
+ for (i = 0, j = strlen(s)-1; i<j; i++, j--)
+ {
+ c = s[i];
+ s[i] = s[j];
+ s[j] = c;
+ }
+}
+
+char * itoa(int n, char *s)
+{
+ int i, sign;
+
+ if ((sign = n) < 0)
+ n = -n;
+
+ i = 0;
+
+ do
+ {
+ s[i++] = n % 10 + '0';
+ } while ((n /= 10) > 0);
+
+ if (sign < 0)
+ s[i++] = '-';
+
+ s[i] = 0;
+
+ reverse(s);
+
+ return s;
+}
+
+
+void scenario()
+{
+ grx_text("S.Ha.R.K. Pavia Demo 1.0", 0, 0, rgb16(0,255,0), black );
+ grx_text("by Paolo Gai 1999-2001" , 0, 8, rgb16(0,255,0), black );
+ grx_text(" pj@sssup.it" , 0,16, rgb16(0,255,0), black );
+
+ grx_text("Ctrl-C, Ctrr-C, Enter: exit" ,320, 0, gray, black );
+ grx_text("Alt-C : void stat." ,320, 8, gray, black );
+ grx_text("Space : create noise ball",320,16, gray, black );
+ grx_text("Backspace : kill noise balls" ,320,24, gray, black );
+
+
+ #ifdef JET_ON
+ scenario_jetcontrol();
+ #endif
+
+ #ifdef BALL_ON
+ scenario_ball();
+ #endif
+}
+
+
+void demo_exc_handler(int signo, siginfo_t *info, void *extra)
+{
+ struct timespec t;
+
+ grx_close();
+
+ /* Default action for an kern exception is */
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t),
+ kern_printf("\nS.Ha.R.K. Exception raised!!!"
+ "\nTime (s:ns) :%d:%d"
+ "\nException number:%d"
+ "\nPID :%d\n",
+ t.tv_sec, t.tv_nsec, info->si_value.sival_int,
+ info->si_task);
+ sys_end();
+}
+
+void my_close(void *arg)
+{
+ grx_close();
+ kern_printf("my_close\n");
+}
+
+
+void endfun(KEY_EVT *k)
+{
+ cprintf("Ctrl-Brk pressed! Ending...\n");
+ sys_end();
+}
+
+void zerofun(KEY_EVT *k)
+{
+ int i;
+ for (i=0; i<MAX_PROC; i++) jet_delstat(i);
+}
+
+void printeventqueue(void *arg)
+{
+ struct event *p;
+ extern struct event *firstevent;
+
+ kern_cli();
+ grx_close();
+ kern_cli();
+ for (p = firstevent; p != NULL; p = p->next) {
+ kern_printf("par:%d time:%d.%d p:%d handler:%d\n",
+ p->par, p->time.tv_sec, p->time.tv_nsec/1000, p, p->handler);
+ }
+ kern_sti();
+}
+
+int main(int argc, char **argv)
+{
+ int modenum;
+
+ KEY_EVT k;
+
+ srand(4);
+
+ version();
+
+ keyb_set_map(itaMap);
+ k.flag = CNTR_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,endfun);
+ k.flag = CNTL_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,endfun);
+ k.flag = ALTL_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,zerofun);
+ k.flag = 0;
+ k.scan = KEY_ENT;
+ k.ascii = 13;
+ keyb_hook(k,endfun);
+
+ set_exchandler_grx();
+ sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
+
+
+ grx_init();
+ modenum = grx_getmode(640, 480, 16);
+
+ grx_setmode(modenum);
+
+ /* init the graphic mutex */
+ app_mutex_init(&mutex);
+
+ /* useful colors ... */
+ white = rgb16(255,255,255);
+ black = rgb16(0,0,0);
+ red = rgb16(255,0,0);
+ gray = rgb16(128,128,128);
+
+ scenario();
+
+ #ifdef JET_ON
+ init_jetcontrol();
+ #endif
+
+ #ifdef BALL_ON
+ init_ball();
+ #endif
+
+ group_activate(1);
+
+ return 0;
+}
+
+
Index: branches/pj/jumpball/jetctrl.c
===================================================================
--- branches/pj/jumpball/jetctrl.c (nonexistent)
+++ branches/pj/jumpball/jetctrl.c (revision 1085)
@@ -0,0 +1,244 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+// JetControl
+
+#include "demo.h"
+#include "kernel/func.h"
+
+TASK jetdummy_task(void *arg)
+{
+ TIME now_dummy, last_dummy, diff_dummy, slice;
+ struct timespec now, last, diff;
+ int x = 0;
+ int height;
+
+ NULL_TIMESPEC(&last);
+ last_dummy = 0;
+ for (;;) {
+ task_nopreempt();
+ jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
+ sys_gettime(&now);
+ task_preempt();
+
+ SUBTIMESPEC(&now, &last, &diff);
+ slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
+ diff_dummy = now_dummy - last_dummy;
+
+ height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
+
+ TIMESPEC_ASSIGN(&last, &now);
+ last_dummy = now_dummy;
+
+ mutex_lock(&mutex);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
+ JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
+ JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
+ grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
+ JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
+ mutex_unlock(&mutex);
+
+ x = (x+1)%JET_DUMMY_WIDTH;
+
+ task_endcycle();
+ }
+}
+
+
+TASK jetctrl_task(void *arg)
+{
+ char st[50];
+ TIME sum, max;
+ int n;
+
+ PID i;
+ int printed = 0;
+
+ for (;;) {
+ for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
+ if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
+ if (!n) n=1;
+ sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
+ mutex_lock(&mutex);
+ grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
+ mutex_unlock(&mutex);
+ printed++;
+ }
+ }
+ while (printed<JET_NTASK) {
+ mutex_lock(&mutex);
+ grx_text(" ",
+ 384, JET_Y_NAME+16+printed*8, gray, black);
+ mutex_unlock(&mutex);
+ printed++;
+ }
+ task_endcycle();
+ }
+}
+
+TASK jetslide_task(void *arg)
+{
+ TIME sum, curr, max;
+
+ TIME total[JET_NTASK];
+ int slides[JET_NTASK];
+
+ PID i;
+ int printed = 0;
+
+ for (;;) {
+ // Fill the total array in a nonpreemptive section
+ task_nopreempt();
+ for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
+ if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
+ total[printed] = sum+curr;
+ printed++;
+ }
+ }
+ task_preempt();
+
+ while (printed < JET_NTASK)
+ total[printed++] = 0;
+
+ // Compute the Max elapsed time
+ max = 0;
+ for (i=0; i<JET_NTASK; i++)
+ if (total[i] > max) max = total[i];
+ if (!max) max = 1;
+
+ // Compute the slides width
+ for (i=0; i<JET_NTASK; i++)
+ slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
+
+ // print the data
+ mutex_lock(&mutex);
+ for (i=0; i<JET_NTASK; i++) {
+ grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
+ JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
+ grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
+ JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
+ }
+
+ while (i<JET_NTASK) {
+ grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
+ JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
+ i++;
+ }
+ mutex_unlock(&mutex);
+ task_endcycle();
+ }
+}
+
+
+void scenario_jetcontrol(void)
+{
+ grx_text("System load" , 384, 45, rgb16(0,0,255), black);
+ grx_line(384,55,639,55,red);
+
+ grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
+ grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
+
+ grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
+ JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
+
+ grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
+ grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
+
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
+}
+
+void init_jetcontrol(void)
+{
+ SOFT_TASK_MODEL m3, m4, m5;
+
+ PID p3, p4, p5;
+
+ soft_task_default_model(m3);
+ soft_task_def_level(m3,1);
+ soft_task_def_period(m3, PERIOD_JETCTRL);
+ soft_task_def_met(m3, WCET_JETCTRL);
+ soft_task_def_ctrl_jet(m3);
+ soft_task_def_group(m3, 1);
+ p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
+ if (p3 == -1) {
+ grx_close();
+ perror("Could not create task <jetctrl>");
+ sys_end();
+ }
+
+ soft_task_default_model(m4);
+ soft_task_def_level(m4,1);
+ soft_task_def_period(m4, PERIOD_JETDUMMY);
+ soft_task_def_met(m4, WCET_JETDUMMY);
+ soft_task_def_group(m4, 1);
+ soft_task_def_usemath(m4);
+ soft_task_def_ctrl_jet(m4);
+ p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
+ if (p4 == -1) {
+ grx_close();
+ perror("Could not create task <jetdummy>");
+ sys_end();
+ }
+
+ soft_task_default_model(m5);
+ soft_task_def_level(m5,1);
+ soft_task_def_period(m5, PERIOD_JETSLIDE);
+ soft_task_def_met(m5, WCET_JETSLIDE);
+ soft_task_def_group(m5, 1);
+ soft_task_def_usemath(m5);
+ soft_task_def_ctrl_jet(m5);
+ p5 = task_create("jsli", jetslide_task, &m5, NULL);
+ if (p5 == -1) {
+ grx_close();
+ perror("Could not create task <jetslide>");
+ sys_end();
+ }
+}
+
Index: branches/pj/jumpball/demo.h
===================================================================
--- branches/pj/jumpball/demo.h (nonexistent)
+++ branches/pj/jumpball/demo.h (revision 1085)
@@ -0,0 +1,147 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: demo.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include <ll/ll.h>
+#include <kernel/types.h>
+#include <kernel/descr.h>
+#include <math.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+
+
+#define JET_ON
+#define BALL_ON
+
+/*
+ *
+ * WCET, Periods and Models
+ *
+ */
+
+
+/* define if you want NRT or SOFT... */
+#define TASK_TYPE SOFT
+//#define TASK_TYPE NRT
+
+#define WCET_JETCTRL 7500
+#define WCET_JETDUMMY 200
+#define WCET_JETSLIDE 2100
+
+#define PERIOD_JETCTRL 100000
+#define PERIOD_JETDUMMY 100000
+#define PERIOD_JETSLIDE 100000
+
+
+#define WCET_BALL 100
+
+#define PERIOD_BALL 10000
+
+/*
+ *
+ * Global Stuffs
+ *
+ */
+
+/* graphic mutex... */
+extern mutex_t mutex;
+
+/* useful colors... */
+extern int white;
+extern int black;
+extern int red;
+extern int gray;
+
+void init_jetcontrol();
+void init_ball(void);
+void scenario_jetcontrol();
+void scenario_ball();
+char *itoa(int n, char *s);
+int myrand(int x);
+
+
+
+/*
+ *
+ * JETCONTROL stuffs
+ *
+ */
+
+#define JET_NTASK 35
+#define JET_Y_NAME 170
+
+#define DUMMY_PID 1
+
+#define JET_DUMMY_WIDTH 210
+#define JET_DUMMY_HEIGHT 80
+
+/* the point (x, y) is the top left corner */
+#define JET_DUMMY_X 428
+#define JET_DUMMY_Y 65
+
+#define JET_SLIDE_WIDTH 50
+#define JET_SLIDE_X 576
+
+
+
+
+/*
+ *
+ * BALL stuffs
+ *
+ */
+
+// x and y corners are specified whithout consider a border of 3 pixels
+#define BALL_Y 450 /* position of the floor */
+#define BALL_HEIGHT 385 /* initial height of the ball */
+#define BALL_XMIN 10 /* min position X of the ball */
+#define BALL_XMAX 370 /* max position X of the ball */
+#define BALL_VELX 5. /* horizontal ball velocity */
+#define BALL_VYMIN 11. /* min ground speed */
+#define BALL_MAX_P 60 /* max number of balls */
+
+#define BALL_GROUP 2 /* task group of the balls */
Index: branches/pj/jumpball/readme.txt
===================================================================
--- branches/pj/jumpball/readme.txt (nonexistent)
+++ branches/pj/jumpball/readme.txt (revision 1085)
@@ -0,0 +1,75 @@
+----------------------------------
+Jumping Balls demo
+
+by
+
+Paolo Gai 1999-2001 - pj@sssup.it
+
+----------------------------------
+
+This demo was created to show some S.Ha.R.K. functionalities in the course
+of Informatica Industriale , University of Pavia, Italy.
+
+The demo is composed by an application (derived by the template application
+distributed on the web site) and two init files.
+
+The demo is composed by:
+
+MAKEFILE The makefile used to compile the application;
+ demo is the rule to compile the application with a CBS scheduler
+ demo2 is the rule to compile the application with a RR scheduler
+README.TXT This file
+DEMO.H Some constants used into the demo
+INITFIL1.C The CBS initfile
+INITFIL2.C The EDF initfile
+INITFILE.C A makefile that cover either EDF+CBS and RR
+BALL.C The Jumping balls part of the demo
+DEMO.C The main() function and some other utility function
+JETCTRL.C The JET part of the demo
+
+
+The demo works as follows:
+- It works at 640x480 16 bit colors
+- on the left, there is the jumping ball arena, on the rigth there is the
+ statistics about the tasks into the system.
+
+- the tasks are guaranteed using CBS and EDF. The wcet and mean execution
+ time on my portable after a few minutes are (us):
+
+ JetCtrl 7400 max 7500 CBS met
+ JetDummy 135 max 200 CBS met
+ JetSlide 2100 max 2100 CBS met
+ Balls 276 max 380 EDF wcet for hard ball,100 CBS met for soft ones
+
+ The system should go overloaded with 40 soft balls.
+
+- The idea is the following:
+ - first, an edf guaranteed ball is created.
+ - then, create a set of soft ball using space. since their met is < than the
+ real met, they posticipate the deadlines.
+ - if they are killed, they remain for some seconds in the zombie state
+ - if a set of soft ball arde created (i.e., 10), and after a while all the
+ others are created, the bandwidth is fully used, and the task posticipate
+ their deadlines. the first set of tasks stops jumping when the bandwidth
+ is full utilized by the newest balls until all the tasks have similar
+ deadlines.
+ - Note on the left the slides that represents the relative ratio
+ between the tasks.
+ - Note that in overload conditions the EDF task is still guaranteed
+ - Note that PI is used with EDF, also if no theory says that it is good:
+ - S.Ha.R.K. allows that, it is the user that have to choose if that is
+ a non-sense
+ - PI is independent from the implemnentation of the scheduling modules
+ - if the second init file is used, RR is used instead of EDF+CBS.
+ - In overload condition RR perform differently from EDF+CBS, giving to
+ each task an equal fraction of bandwidth
+
+ - note also:
+ - the redefinition of the standard exception handler
+ - the redefinition of the keys and the initialization of the keyboard
+ - the myend exit function
+ - the main() that terminates
+ - the two parts (ball and jet) can be excluded using a #define
+
+If You have any question, please contact the author...
+
Index: branches/pj/jumpball/ball.c
===================================================================
--- branches/pj/jumpball/ball.c (nonexistent)
+++ branches/pj/jumpball/ball.c (revision 1085)
@@ -0,0 +1,239 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ball.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*--------------------------------------------------------------*/
+/* SIMULATION OF JUMPING BALLS */
+/*--------------------------------------------------------------*/
+
+#include "demo.h"
+#include <kernel/func.h>
+#include <stdlib.h>
+
+#define R 8 /* dimension of a ball */
+#define G 9.8 /* acceleration of gravity */
+
+static int ballexit = 0;
+static int npc = 0; /* number of tasks created */
+
+/*--------------------------------------------------------------*/
+/* Periodic task for ball simulation */
+/*--------------------------------------------------------------*/
+
+TASK palla(int i)
+{
+int x, y; /* coordinate grafiche pallina */
+int ox, oy; /* vecchia posizione pallina */
+int x0, y0; /* posizione iniziale X pallina */
+float vx, vy; /* velocit… della pallina */
+float vy0; /* velocita' pallina al primo rimbalzo */
+float ty, tx; /* variabile temporale */
+float dt; /* incremento temporale */
+
+ y = oy = y0 = BALL_HEIGHT;
+ x = ox = x0 = BALL_XMIN;
+
+ vy0= sqrt(2. * G * (float)BALL_HEIGHT);
+ vy = 0;
+ vx = BALL_VELX + myrand(9);
+ tx = 0;
+ ty = 0;
+ dt = ((float)PERIOD_BALL)/100000;
+
+ while (1) {
+ y = y0 + vy*ty - .5*G*ty*ty;
+ x = x0 + vx * tx;
+
+ if (y < 0) {
+ y = 0;
+
+ if (vy == 0.0)
+ vy = vy0;
+ else if (vy < BALL_VYMIN)
+ vy = vy0 * (1.0 - myrand(50)/100.0);
+ else
+ vy = 0.9 * vy;
+
+ ty = 0.0;
+ y0 = 0;
+ }
+
+ if (x > BALL_XMAX) {
+ tx = 0.0;
+ x0 = BALL_XMAX;
+ vx = -vx;
+ x = x0 + vx * tx;
+ }
+
+ if (x < BALL_XMIN) {
+ tx = 0.0;
+ x0 = BALL_XMIN;
+ vx = -vx;
+ x = x0 + vx * tx;
+ }
+
+ mutex_lock(&mutex);
+ grx_disc(ox, oy, R, 0);
+ ox = x;
+ oy = BALL_Y - y;
+ mutex_unlock(&mutex);
+
+ if (ballexit && i!=0xFFFF) {
+ npc--;
+ return 0;
+ }
+
+ mutex_lock(&mutex);
+ grx_disc(ox, oy, R, i);
+ mutex_unlock(&mutex);
+
+ {
+ int xxx;
+ for (xxx=0; xxx<10000; xxx++);
+ }
+ ty += dt;
+ tx += dt;
+ task_endcycle();
+ }
+}
+
+void killball(KEY_EVT *k)
+{
+ ballexit = 1;
+}
+
+void ballfun(KEY_EVT *k)
+{
+ SOFT_TASK_MODEL mp;
+ int r,g,b;
+ PID pid;
+ char palla_str[]="palla ";
+
+ if (npc == BALL_MAX_P) return;
+
+ ballexit = 0;
+
+ r = 64 + myrand(190);
+ g = 64 + myrand(190);
+ b = 64 + myrand(190);
+
+ itoa(npc,palla_str+5);
+
+ soft_task_default_model(mp);
+ soft_task_def_level(mp,1);
+ soft_task_def_ctrl_jet(mp);
+ soft_task_def_arg(mp, (void *)rgb16(r,g,b));
+ soft_task_def_group(mp, BALL_GROUP);
+ soft_task_def_met(mp, WCET_BALL);
+ soft_task_def_period(mp,PERIOD_BALL);
+ soft_task_def_usemath(mp);
+ pid = task_create(palla_str, palla, &mp, NULL);
+
+ if (pid != NIL) {
+ task_activate(pid);
+ npc++;
+ }
+}
+
+void hardball()
+{
+ HARD_TASK_MODEL mp;
+ int r,g,b;
+ PID pid;
+
+ r = 255;
+ g = 255;
+ b = 255;
+
+ hard_task_default_model(mp);
+ hard_task_def_ctrl_jet(mp);
+ hard_task_def_arg(mp, (void *)rgb16(r,g,b));
+ hard_task_def_wcet(mp, 380);
+ hard_task_def_mit(mp,PERIOD_BALL);
+ hard_task_def_usemath(mp);
+ pid = task_create("pallaEDF", palla, &mp, NULL);
+ if (pid == NIL) {
+ grx_close();
+ perror("Could not create task <pallaEDF>");
+ sys_end();
+ }
+ else
+ task_activate(pid);
+}
+
+
+/*--------------------------------------------------------------*/
+/* MAIN process */
+/*--------------------------------------------------------------*/
+
+void scenario_ball()
+{
+ grx_text("Noise", 0, 45 /*BALL_Y-BALL_HEIGHT-15*/, rgb16(0,0,255), black);
+ grx_line(0,55,383,55,red);
+//grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
+
+ grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
+ BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
+}
+
+void init_ball(void)
+{
+ KEY_EVT k;
+
+ hardball();
+
+ k.flag = 0;
+ k.scan = KEY_SPC;
+ k.ascii = ' ';
+ keyb_hook(k,ballfun);
+
+ k.flag = 0;
+ k.scan = KEY_BKS;
+ k.ascii = ' ';
+ keyb_hook(k,killball);
+}
+
+/*--------------------------------------------------------------*/
Index: branches/pj/jumpball/makefile
===================================================================
--- branches/pj/jumpball/makefile (nonexistent)
+++ branches/pj/jumpball/makefile (revision 1085)
@@ -0,0 +1,19 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= demo
+
+include $(BASE)/config/example.mk
+
+demo:
+ make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="initfil1.o ball.o jetctrl.o" OTHERINCL=
+
+demo2:
+ make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="initfil2.o ball.o jetctrl.o" OTHERINCL=
+
Index: branches/pj/robots/lab3.txt
===================================================================
--- branches/pj/robots/lab3.txt (nonexistent)
+++ branches/pj/robots/lab3.txt (revision 1085)
@@ -0,0 +1,11 @@
+3
+540 380 15 270
+510 380 15 270
+480 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: branches/pj/robots/initfile.c
===================================================================
--- branches/pj/robots/initfile.c (nonexistent)
+++ branches/pj/robots/initfile.c (revision 1085)
@@ -0,0 +1,104 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:43 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:43 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_cfgfile(int);
+
+int argc;
+char *argv[100];
+
+void read_cfg_file(int argc, char **argv);
+
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(0);
+ CBS_register_level(0, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ read_cfg_file(argc, argv);
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
Index: branches/pj/robots/lab1m.txt
===================================================================
--- branches/pj/robots/lab1m.txt (nonexistent)
+++ branches/pj/robots/lab1m.txt (revision 1085)
@@ -0,0 +1,9 @@
+1
+540 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: branches/pj/robots/mouse2.c
===================================================================
--- branches/pj/robots/mouse2.c (nonexistent)
+++ branches/pj/robots/mouse2.c (revision 1085)
@@ -0,0 +1,935 @@
+/*--------------------------------------------------------------*/
+/* Title: Mouse */
+/* Autor: João Capucho */
+/* Date: 9/12/2000 */
+/* Description: */
+/* Simulation of small automats based on the */
+/* "micro-rato" conteste */
+/*--------------------------------------------------------------*/
+
+/*
+ * Copyright (C) 2001 João Capucho
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+// Includes
+#include <ll/i386/x-dos.h>
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <math.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#define sqr(x) (x*x)
+
+// Error Types
+#define OK 0
+#define MEMORY_ERROR -1
+#define ILEGAL_PARAMETER -2
+
+// Types of sensors and motors
+#define NONE 0
+#define OBSTACLE 1
+#define BEACON 2
+#define GROUND 3
+#define STEP 4
+
+// Maze limits
+#define LAB_XMIN 40
+#define LAB_XMAX 600
+#define LAB_YMIN 40
+#define LAB_YMAX 440
+
+#define MOTOR_RIGHT 1
+#define MOTOR_LEFT 0
+
+#define BACKCOLOR 0 // Background color
+#define OUTCOLOR 14 // Color of the outside walls
+#define FINISHCOLOR 7 // Finishin area color
+#define NONBLOCKCOLOR 14 // Non block boxs
+#define BLOCKCOLOR 13 // Block boxs
+
+#define BOX_BLOCK 1 // The box blocks the beacon
+#define BOX_NON_BLOCK 2 // The box doesn´t block the beacon
+
+#define MAX_MOUSES 5 // Maximum of mouses in the Maze
+#define MAX_BOXS 100 // Maximum of boxs in the Maze
+#define MAX_SENSORS 20 // Maximum of sensors in each mouse
+#define SENSOR_MIN_GROUND 0 // Minimum value of a ground sensor
+#define SENSOR_MAX_GROUND 255 // Maximum value of a ground sensor
+#define SENSOR_MIN_OBSTACLE 77 // Minimum value of a obstacle sensor
+#define SENSOR_MAX_OBSTACLE 128 // Maximum value of a obstacle sensor
+#define SENSOR_MIN_BEACON 77 // Minimum value of a beacon sensor
+#define SENSOR_MAX_BEACON 128 // Maximum value of a beacon sensor
+#define BEACON_INTENSITY 400 // Maximun intensity of the beacon
+
+#define MOUSE_PERIOD 20000 // Period
+#define CALC_PERIOD 2000 // Period
+#define REFEREE_PERIOD 1000 // Period of the referee
+#define REDRAW_MOUSE_PERIOD 25000 // Period for redraw mouse
+#define REDRAW_MAZE_PERIOD 100000 // Period for redraw maze
+#define MOUSEGROUP 511
+
+struct SENSOR
+{
+ int Type; // Tipe of sensor ( None - Obstacle - Beacon - Ground)
+ int Radius; // Distance from de center of the mouse
+ int Pos_Angle; // Angle between the sensor and the front of the mouse
+ int Dir; // Angle between the direction of the sensores and the front of the mouse
+ int Angle; // Half angle of visual field (between (Dir-Angle) and (Dir+Angle))
+ int Intensity; // Sensativity of the sensor
+ float Value; // Last value readed
+};
+
+struct MOTOR
+{
+ int Radius; // Distance from de center of the mouse
+ int V; // Current velocity
+ float Old_V; // Previews velocity
+};
+
+struct MOUSE
+{
+ float X, Y; // Current position of the center
+ float Old_X, Old_Y; // Previous position of the center
+ int Radius; // Size of the mouse ( every mouse is considered round )
+ float Dir; // Points to the front
+ float Old_Dir; // Previous front
+ int NSensors; // Number of sensors in the mouse
+ struct SENSOR Sensors[MAX_SENSORS]; // Pointer to the structer that contains the information of the sensors
+ struct MOTOR Motors[2]; // Pointer to the structer that contains the information of the motors
+ WORD NColision; // Total of colisions
+ WORD PColision; // Auxiliar for colisions
+ char Flag; // Initialization flag
+};
+
+
+
+struct BOX // Structer that represents the obstacles
+{ //in this case all the obstacles are boxs
+ int Type; // Type of the obstatcle
+ int X1, Y1, X2, Y2; // position of the box
+};
+
+struct SBEACON // Beacon information
+{
+ int Intensity; // Intensity of the beacon
+ int X, Y; // position of the beacon
+};
+
+struct MAZE
+{
+ int X1, Y1, X2, Y2; // limites of the maze
+ int NBoxs; // Number of objstacles in the maze
+ struct BOX Boxs[MAX_BOXS]; // Information about all thr obstacles
+ struct SBEACON Beacon; // Beacon data
+ int Radius; // Size of the finishing area
+};
+
+int Seno[360+90]; // Sine table
+int Tang[180]; // Tangente table
+int NMouses=0;
+struct MOUSE Mouse[MAX_MOUSES]; // Global variable that represents all the mouses
+struct MAZE Maze; // Global variable that represents the maze
+
+// Init_Maze - Initialize the Maze
+// Beacon_X - Coordinate X of the beacon
+// Beacon_Y - Coordinate Y of the beacon
+// Intensity - Intensity of the beacon
+// NBoxs - Number of boxs in the maze
+// Return: OK - Sucess
+
+int Init_Maze(int Beacon_X, int Beacon_Y, int Intensity, int NBoxs)
+{
+ int i;
+ Maze.X1=LAB_XMIN;
+ Maze.Y1=LAB_YMIN;
+ Maze.X2=LAB_XMAX;
+ Maze.Y2=LAB_YMAX;
+ Maze.Beacon.X=Beacon_X+LAB_XMIN;
+ Maze.Beacon.Y=Beacon_Y+LAB_YMIN;
+ if (Intensity<BEACON_INTENSITY)
+ Maze.Beacon.Intensity=Intensity;
+ else
+ Maze.Beacon.Intensity=BEACON_INTENSITY;
+ if (NBoxs<MAX_BOXS)
+ Maze.NBoxs=NBoxs;
+ else
+ Maze.NBoxs=MAX_BOXS;
+ Maze.Radius=50;
+ for(i=0; i < Maze.NBoxs; i++)
+ Maze.Boxs[i].Type=NONE;
+ return OK;
+}
+
+// Init_Box - Initialize data of the NBox obstacle
+// NBox - Identifier of the obstacle
+// X1 - Coordinate X
+// Y1 - Coordinate Y
+// X2 - Coordinate X
+// Y2 - Coordinate Y
+// Type - Type of the obstacle
+// Return: OK - Sucess
+
+int Init_Box(int NBox, int X1, int Y1, int X2, int Y2, int Type)
+{
+ Maze.Boxs[NBox].Type=Type;
+ if (X1<X2)
+ {
+ Maze.Boxs[NBox].X1=X1+LAB_XMIN;
+ Maze.Boxs[NBox].X2=X2+LAB_XMIN;
+ }
+ else
+ {
+ Maze.Boxs[NBox].X1=X2+LAB_XMIN;
+ Maze.Boxs[NBox].X2=X1+LAB_XMIN;
+ }
+ if (Y1<Y2)
+ {
+ Maze.Boxs[NBox].Y1=Y1+LAB_YMIN;
+ Maze.Boxs[NBox].Y2=Y2+LAB_YMIN;
+ }
+ else
+ {
+ Maze.Boxs[NBox].Y1=Y2+LAB_YMIN;
+ Maze.Boxs[NBox].Y2=Y1+LAB_YMIN;
+ }
+ return OK;
+}
+
+// Draw_Maze - Draws the outline of the maze and the obstacles
+// Return: OK - Sucess
+int Draw_Maze(void)
+{
+ int i;
+ grx_rect( Maze.X1, Maze.Y1, Maze.X2, Maze.Y2, OUTCOLOR);
+ grx_rect( Maze.X1-1, Maze.Y1+1, Maze.X2+1, Maze.Y2+1, OUTCOLOR);
+ grx_rect( Maze.X1-2, Maze.Y1+2, Maze.X2+2, Maze.Y2+2, OUTCOLOR);
+ grx_circle(Maze.Beacon.X, Maze.Beacon.Y, Maze.Radius, FINISHCOLOR);
+ grx_disc(Maze.Beacon.X, Maze.Beacon.Y, 10, 7);
+ for (i=0; i<Maze.NBoxs; i++)
+ {
+ if (Maze.Boxs[i].Type==BOX_NON_BLOCK)
+ grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
+ Maze.Boxs[i].X2, Maze.Boxs[i].Y2, NONBLOCKCOLOR);
+ if (Maze.Boxs[i].Type==BOX_BLOCK)
+ grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
+ Maze.Boxs[i].X2, Maze.Boxs[i].Y2, BLOCKCOLOR);
+ }
+ return OK;
+}
+
+int Init_Motor(int NMouse, int Motor, int Radius)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((Motor<0) || (Motor>=2))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Motors[Motor].Radius=Radius;
+ Mouse[NMouse].Motors[Motor].V=0;
+ Mouse[NMouse].Motors[Motor].Old_V=0.0;
+ return OK;
+}
+
+// Init_Mouse - inicialize the parameters of each mouse
+// NMouse - Identifier of the mouse
+// X - Coordinate X of the center
+// Y - Coordinate Y of the center
+// Radius - Radius of the mouse (size)
+// Dir - Angle of direction in witch i will start
+// NSensors - Number of sensors in the mouse (all types)
+//
+// Return: OK - Sucess
+// ILEGAL_PARAMETER - If NMouse negative of greater than maximum number of mouses
+// Note: All the types of sensors and motors are initialize to NONE
+
+int Init_Mouse(int NMouse, int X, int Y, int Radius, int Dir, int NSensors)
+{
+ int i;
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensors<0) || (NSensors>MAX_SENSORS))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].X=(float)X+LAB_XMIN;
+ Mouse[NMouse].Y=(float)Y+LAB_YMIN;
+ Mouse[NMouse].Radius=Radius;
+ Mouse[NMouse].Dir=Dir;
+ Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
+ Mouse[NMouse].NSensors=NSensors;
+ Mouse[NMouse].Old_X=Mouse[NMouse].X;
+ Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
+ Mouse[NMouse].NColision=0;
+ Mouse[NMouse].PColision=0;
+ for(i=0; i < Mouse[NMouse].NSensors; i++)
+ Mouse[NMouse].Sensors[i].Type=NONE;
+
+ Init_Motor(NMouse, MOTOR_LEFT, 10);
+ Init_Motor(NMouse, MOTOR_RIGHT, -10);
+
+ return OK;
+}
+
+// Init_Sensor - Initializes the sensor information
+// NMouse - Identifier of the mouse
+// Sensor - Identifier of the sensor to be used
+// Type - Type of sensor ( Ground, obstacle or beacon sensor )
+// Radius and Pos_Angle - Polar coordinates to determen the sensor position
+// Dir - Diretion of the sensor ( angle between the front and the sensor )
+// Angle - Half of the visual range
+// Intensity - Maximun distance of detect
+int Init_Sensor(int NMouse, int Sensor, int Type, int Radius,
+ int Pos_Angle, int Dir, int Angle, int Intensity)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((Sensor<0) || (Sensor>=Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Sensors[Sensor].Type=Type;
+ Mouse[NMouse].Sensors[Sensor].Radius=Radius;
+ Mouse[NMouse].Sensors[Sensor].Pos_Angle=Pos_Angle;
+ Mouse[NMouse].Sensors[Sensor].Dir=Dir;
+ Mouse[NMouse].Sensors[Sensor].Angle=Angle;
+ Mouse[NMouse].Sensors[Sensor].Intensity=Intensity;
+ if (Type == GROUND)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_GROUND;
+ if (Type == OBSTACLE)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_OBSTACLE;
+ if (Type == BEACON)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_BEACON;
+ return OK;
+}
+
+int Set_Motor_Vel(int NMouse, int NMotor, int Vel)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NMotor<0) || (NMotor>2))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Motors[NMotor].V=Vel;
+ return OK;
+}
+
+int Read_Sensor(int NMouse, int NSensor)
+{
+ int X, Y, Dir, cr, sr, AuxX, AuxY;
+ int Count, AuxCount, AngCount, AuxAngCount, RetColor, Intensity;
+ float Auxf;
+
+ /* Inicial verifications */
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+
+ /* If Sensor Not define exit */
+ if ( Mouse[NMouse].Sensors[NSensor].Type == NONE )
+ return OK;
+
+ /* Calculate de position of the sensor and is direction */
+ Dir=(int)Mouse[NMouse].Old_Dir+Mouse[NMouse].Sensors[NSensor].Dir;
+ if (Dir >= 360)
+ Dir -= 360;
+ if (Dir < 0)
+ Dir += 360;
+ X= Mouse[NMouse].Old_X*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir+90]));
+ Y= Mouse[NMouse].Old_Y*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir]));
+
+ /* if the Sensor type is OBSTACLE */
+ if ( Mouse[NMouse].Sensors[NSensor].Type == OBSTACLE )
+ {
+ Intensity=Mouse[NMouse].Sensors[NSensor].Intensity;
+ AuxCount=Intensity;
+ /* Scan all the visual field */
+ for (AngCount=(-Mouse[NMouse].Sensors[NSensor].Angle);
+ AngCount<=Mouse[NMouse].Sensors[NSensor].Angle;
+ AngCount++)
+ {
+ AuxAngCount=Dir+AngCount;
+ if (AuxAngCount >= 360)
+ AuxAngCount -= 360;
+ if (AuxAngCount < 0)
+ AuxAngCount += 360;
+ sr=Seno[AuxAngCount];
+ cr=Seno[AuxAngCount+90];
+ Count=Mouse[NMouse].Radius-Mouse[NMouse].Sensors[NSensor].Radius+2;
+ AuxX = X+cr*Count;
+ AuxY = Y+sr*Count;
+ for (; Count<=AuxCount; Count++)
+ {
+ AuxX += cr;
+ AuxY += sr;
+ RetColor = grx_getpixel(AuxX >> 16, AuxY >> 16);
+ if ((RetColor != BACKCOLOR)&&(RetColor != FINISHCOLOR))
+ AuxCount=Count;
+ }
+ }
+ Count=Mouse[NMouse].Sensors[NSensor].Intensity;
+ Count*=Count;
+ AuxCount*=AuxCount;
+ Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)
+ *AuxCount)/Count;
+ Mouse[NMouse].Sensors[NSensor].Value=
+ (0.5*Mouse[NMouse].Sensors[NSensor].Value+0.5*(float)Count);
+ }
+ if ( Mouse[NMouse].Sensors[NSensor].Type == GROUND )
+ {
+ Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MIN_GROUND;
+ AuxX=abs((X>>16)-Maze.Beacon.X);
+ AuxY=abs((Y>>16)-Maze.Beacon.Y);
+ if ((AuxX>50) || (AuxY>50))
+ return OK;
+ if ((AuxX*AuxX+AuxY*AuxY)<Maze.Radius*Maze.Radius)
+ Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MAX_GROUND;
+ }
+
+ if ( Mouse[NMouse].Sensors[NSensor].Type == BEACON )
+ {
+ AuxX=(X>>16)-Maze.Beacon.X;
+ AuxY=(Y>>16)-Maze.Beacon.Y;
+ AngCount=0;
+ if (AuxX!=0)
+ {
+ AuxAngCount=(AuxY<<16)/AuxX;
+ if (AuxAngCount<0)
+ AngCount=90;
+ for (Count=AngCount;Count<AngCount+90;Count++)
+ {
+ if ((Tang[Count]<=AuxAngCount) && (Tang[Count+1]>AuxAngCount))
+ break;
+ }
+ }
+ else
+ Count=90;
+ if (AuxY<0)
+ Count+=180;
+ AuxAngCount=abs(180-abs(Dir-Count));
+ Count=SENSOR_MIN_BEACON;
+ if (AuxAngCount<Mouse[NMouse].Sensors[NSensor].Angle)
+ {
+ Count=AuxX*AuxX+AuxY*AuxY;
+ AuxCount=(int)((float)Maze.Beacon.Intensity*(1.0+(0.4*(float)AuxAngCount)/(float)Mouse[NMouse].Sensors[NSensor].Angle));
+ AuxCount*=AuxCount;
+ if (Count<AuxCount)
+ Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)*Count)/AuxCount;
+ else
+ Count=SENSOR_MIN_BEACON;
+ }
+ Auxf=0.5*((float)Count);
+ Auxf+=0.5*((float)Mouse[NMouse].Sensors[NSensor].Value);
+ Mouse[NMouse].Sensors[NSensor].Value=Auxf;
+ }
+ return OK;
+}
+
+int GetSensor(int NMouse, int NSensor)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+ return (int)Mouse[NMouse].Sensors[NSensor].Value;
+}
+
+int Draw_Mouse(int NMouse, int Flag)
+{
+ int Color;
+ if (!Flag)
+ Color=BACKCOLOR;
+ else
+ {
+ Mouse[NMouse].Old_X=Mouse[NMouse].X;
+ Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
+ Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
+ Color=2;
+ }
+ grx_circle(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y, Mouse[NMouse].Radius, Color);
+ grx_line(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y,
+ Mouse[NMouse].Old_X+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir+90]) >> 16),
+ Mouse[NMouse].Old_Y+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir]) >> 16), Color);
+ return OK;
+}
+
+TASK Redraw_Mouse_Task(int NMouse)
+{
+ char str[40];
+ TIME dwTicks;
+ while(1)
+ {
+ dwTicks=sys_gettime(NULL);
+ Draw_Mouse(NMouse, FALSE);
+ Draw_Mouse(NMouse, TRUE);
+ sprintf(str,"Colision: %4d", (int)Mouse[NMouse].NColision);
+ grx_text(str, NMouse*150, 21, 7, 0);
+ sprintf(str,"Motor: %4d Sensor 0: %4d Sensor 1: %4d Sensor 2: %4d Sensor 3: %4d",
+ (int)Mouse[NMouse].Motors[0].Old_V+(int)Mouse[NMouse].Motors[1].Old_V,
+ (int)Mouse[NMouse].Sensors[0].Value, (int)Mouse[NMouse].Sensors[1].Value,
+ (int)Mouse[NMouse].Sensors[2].Value, (int)Mouse[NMouse].Sensors[3].Value);
+ if (NMouse==0)
+ grx_text(str, 1, 1, 7, 0);
+ sprintf(str,"Sensor 4: %4d Sensor 5: %4d Ticks: %4d",
+ (int)Mouse[NMouse].Sensors[4].Value, (int)Mouse[NMouse].Sensors[5].Value,
+ (int)(sys_gettime(NULL)-dwTicks)/1000);
+ if (NMouse==0)
+ grx_text(str, 1, 11, 7, 0);
+ task_endcycle();
+ }
+}
+
+TASK Redraw_Maze_Task(void)
+{
+ while(1)
+ {
+ Draw_Maze();
+ task_endcycle();
+ }
+}
+
+TASK Referee(void)
+{
+ int Counter, Box_Min_X, Box_Max_X ,Box_Min_Y, Box_Max_Y;
+ int deltaX, deltaY, Radius;
+ int Colision;
+ int NMouse;
+
+ while(1)
+ {
+ for(NMouse=0;NMouse<NMouses;NMouse++)
+ {
+ Colision=0;
+ Radius=Mouse[NMouse].Radius;
+ if(Mouse[NMouse].Y<(Maze.Y1+Radius))
+ Colision++;
+ if(Mouse[NMouse].Y>(Maze.Y2-Radius))
+ Colision++;
+ if(Mouse[NMouse].X<(Maze.X1+Radius))
+ Colision++;
+ if(Mouse[NMouse].X>(Maze.X2-Radius))
+ Colision++;
+ for(Counter=0; Counter<Maze.NBoxs; Counter++)
+ {
+ Box_Min_X=Maze.Boxs[Counter].X1-1;
+ Box_Max_X=Maze.Boxs[Counter].X2+1;
+ Box_Min_Y=Maze.Boxs[Counter].Y1-1;
+ Box_Max_Y=Maze.Boxs[Counter].Y2+1;
+ Radius=Mouse[NMouse].Radius;
+ if(Mouse[NMouse].Y<(Box_Min_Y-Radius))
+ continue;
+ if(Mouse[NMouse].Y>(Box_Max_Y+Radius))
+ continue;
+ if(Mouse[NMouse].X<(Box_Min_X-Radius))
+ continue;
+ if(Mouse[NMouse].X>(Box_Max_X+Radius))
+ continue;
+ if((Mouse[NMouse].X>=Box_Min_X) && (Mouse[NMouse].X<=Box_Max_X))
+ if((Mouse[NMouse].Y>=(Box_Min_Y-Radius))
+ && (Mouse[NMouse].Y<=(Box_Max_Y+Radius)))
+ Colision++;
+ if((Mouse[NMouse].Y>=Box_Min_Y) && (Mouse[NMouse].Y<=Box_Max_Y))
+ if((Mouse[NMouse].X>=(Box_Min_X-Radius))
+ && (Mouse[NMouse].X<=(Box_Max_X+Radius)))
+ Colision++;
+ Radius=sqr(Radius);
+ deltaX=sqr(Mouse[NMouse].X-Box_Min_X);
+ deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaX=sqr(Mouse[NMouse].X-Box_Max_X);
+ deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ }
+ if (Mouse[NMouse].PColision && !Colision)
+ Mouse[NMouse].NColision++;
+
+ Mouse[NMouse].PColision=Colision;
+ }
+ task_endcycle();
+ }
+ return (void *)0;
+}
+
+TASK Calculate_Position(int NMouse)
+{
+ float w, v, dt;
+ int b;
+ while(1)
+ {
+ b=(Mouse[NMouse].Motors[MOTOR_LEFT].Radius-
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Radius);
+ if (b<0)
+ b=-b;
+ w=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V-
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
+ w/=(float)b;
+ v=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V+
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
+ v/=2.0;
+ dt=CALC_PERIOD/1000000.0;
+ Mouse[NMouse].Dir += (180.0*w/PI)*dt;
+ if (Mouse[NMouse].Dir >= 360)
+ Mouse[NMouse].Dir -= 360;
+ if (Mouse[NMouse].Dir < 0)
+ Mouse[NMouse].Dir += 360;
+ v *= dt/65536.0;
+ b=(float)Seno[(int)Mouse[NMouse].Dir+90];
+ Mouse[NMouse].X += v*b;
+ b=(float)Seno[(int)Mouse[NMouse].Dir];
+ Mouse[NMouse].Y += v*b;
+ Mouse[NMouse].Motors[0].Old_V=
+ (0.8187*Mouse[NMouse].Motors[0].Old_V+
+ 0.1813*(float)Mouse[NMouse].Motors[0].V);
+ Mouse[NMouse].Motors[1].Old_V=
+ (0.8187*Mouse[NMouse].Motors[1].Old_V+
+ 0.1813*(float)Mouse[NMouse].Motors[1].V);
+ task_endcycle();
+ }
+}
+
+#define SENSOR_LEFT 0
+#define SENSOR_FRONT 1
+#define SENSOR_RIGTH 2
+#define SENSOR_GROUND 3
+#define SENSOR_B_LEFT 4
+#define SENSOR_B_RIGHT 5
+#define MAX_SPEED 50
+#define DIST_DIR GetSensor(NMouse, SENSOR_RIGTH)
+#define DIST_ESQ GetSensor(NMouse, SENSOR_LEFT)
+#define DIST_FRENTE GetSensor(NMouse, SENSOR_FRONT)
+#define FAROL_ESQ GetSensor(NMouse, SENSOR_B_LEFT)
+#define FAROL_DIR GetSensor(NMouse, SENSOR_B_RIGHT)
+#define FAROL_LIM_INF SENSOR_MIN_BEACON+5
+
+#define DIST0 88 //Distancia minima optima
+#define DIST1 DIST0 + 5 // 60%
+#define DIST2 DIST1 + 10 // PARADO
+#define DIST3 DIST2 + 10 // TRAS
+
+#define DISTMAX 120
+#define NENHUM 0
+#define ESQUERDA 1
+#define DIREITA 2
+#define contorno ContornoArr[NMouse]
+
+TASK MouseTask(int NMouse)
+{
+ int i;
+ //char str[100];
+ unsigned char flag;
+ static unsigned char ContornoArr[MAX_MOUSES];
+ signed char modulo;
+
+ Init_Sensor(NMouse, SENSOR_LEFT, OBSTACLE, 14, -45, -45, 25, 15); // Left
+ Init_Sensor(NMouse, SENSOR_FRONT, OBSTACLE, 14, 0, 0, 25, 15); // Center
+ Init_Sensor(NMouse, SENSOR_RIGTH, OBSTACLE, 14, 45, 45, 25, 15); // Rigth
+ Init_Sensor(NMouse, SENSOR_GROUND, GROUND, 10, 180, 180, 0, 20); // Ground
+ Init_Sensor(NMouse, SENSOR_B_LEFT, BEACON, 4, -45, -25, 30, 0); // Left
+ Init_Sensor(NMouse, SENSOR_B_RIGHT, BEACON, 4, 45, 25, 30, 0); // Rigth
+ contorno = NENHUM;
+ Mouse[NMouse].Flag=1;
+
+ while(1)
+ {
+ for(i=0; i<8; i++)
+ Read_Sensor(NMouse, i);
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED);
+
+ flag = ((DIST_DIR>DIST3) && contorno==ESQUERDA) ||
+ ((DIST_ESQ>DIST3) && contorno==DIREITA);
+
+ if ( (DIST_FRENTE>DISTMAX) || flag) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
+ if (contorno == ESQUERDA)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
+ }
+ else {
+
+ // ---------------- Contorno da Esquerda ---------------
+ if (contorno!=DIREITA){
+ if (DIST_ESQ>DIST1) { // Sensor da esquerda
+ contorno = ESQUERDA;
+ if (DIST_ESQ>DIST3) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
+ }
+ else
+ if (DIST_ESQ>DIST2)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/4);
+ }
+ else
+ if (contorno== ESQUERDA) {
+ if(DIST_ESQ<DIST0)
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/10);
+ }
+ }
+
+ // ---------------- Contorno da Direita ---------------
+ if (contorno!=ESQUERDA){
+ if (DIST_DIR>DIST1) { // Sensor da direita
+ contorno = DIREITA;
+ if (DIST_DIR>DIST3) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
+ }
+ else
+ if (DIST_DIR>DIST2)
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/4);
+ }
+ else
+ if (contorno== DIREITA) {
+ if (DIST_DIR<DIST0)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/10);
+ }
+ }
+
+ // --------------- Desempancar contornos com o farol ------------
+
+ if ((contorno == ESQUERDA && FAROL_DIR > FAROL_ESQ && FAROL_DIR > FAROL_LIM_INF) ||
+ (contorno == DIREITA && FAROL_ESQ > FAROL_DIR && FAROL_ESQ > FAROL_LIM_INF) )
+ contorno = NENHUM;
+
+
+
+ if (contorno == NENHUM)
+ {
+ modulo = FAROL_DIR - FAROL_ESQ;
+ if (modulo < 0 )
+ modulo = - modulo;
+
+ // Se nao estiver na direçao certa, ajustar
+ if (modulo > 10) {
+ if (FAROL_DIR > FAROL_ESQ)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
+ }
+ else //velocidade controlada
+ if (modulo > 2) {
+ if (FAROL_DIR > FAROL_ESQ)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*6/10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*6/10);
+ }
+ }
+ }
+ if (GetSensor(NMouse, SENSOR_GROUND)==SENSOR_MAX_GROUND)
+ {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
+ }
+
+ task_endcycle();
+ }
+ return (void *)0;
+}
+
+void my_end(void *arg)
+{
+ grx_close();
+}
+
+/* --------------------------------- Main program -----------------------------*/
+
+int main(int argc, char *argv[])
+{
+ int i;
+ char c;
+ int pid;
+
+ HARD_TASK_MODEL mp;
+ SOFT_TASK_MODEL ms;
+
+ // char StrAux[15];
+
+ set_exchandler_grx();
+
+ for (i=0; i<NMouses; i++)
+ Mouse[i].Flag=0;
+ for (i=0; i<(360+90); i++) // Inicializar a tabela de senos
+ Seno[i]=(int)(65536.0*sin((float)i/180.0*PI));
+
+ for (i=0; i<180; i++) // Inicializar a tabela de tangente
+ if (i!=90)
+ Tang[i]=(int)(((float)Seno[i]/(float)Seno[i+90])*65536.0);
+ else
+ Tang[i]=INT_MAX;
+
+ // Definir fun‡Æo de saida
+ sys_atrunlevel(my_end, (void *)NULL, RUNLEVEL_BEFORE_EXIT);
+
+ hard_task_default_model(mp);
+ hard_task_def_usemath(mp);
+ hard_task_def_group(mp, MOUSEGROUP);
+ hard_task_def_wcet(mp, 1); // wcet ignored by the configuration file!
+
+ soft_task_default_model(ms);
+ soft_task_def_group(ms, MOUSEGROUP);
+ soft_task_def_met(ms, 1000);
+
+ for (i=0;i<NMouses;i++)
+ {
+ hard_task_def_arg(mp, (void *)i);
+ soft_task_def_arg(ms, (void *)i);
+
+ hard_task_def_mit(mp, MOUSE_PERIOD);
+ pid = task_create("Mouse", MouseTask, &mp, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Mouse:");
+ sys_end();
+ }
+
+ hard_task_def_mit(mp, CALC_PERIOD);
+ pid = task_create("Calc", Calculate_Position, &mp, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Calc:");
+ sys_end();
+ }
+
+ soft_task_def_period(ms, REDRAW_MOUSE_PERIOD);
+ pid = task_create("Redraw_Mouse", Redraw_Mouse_Task, &ms, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Redraw_Moude:");
+ sys_end();
+ }
+ }
+
+ hard_task_def_mit(mp, REFEREE_PERIOD);
+ pid = task_create("Referee1", Referee, &mp, NULL);
+
+ hard_task_def_mit(mp, REDRAW_MAZE_PERIOD);
+ pid = task_create("Redraw_Maze", Redraw_Maze_Task, &mp, NULL);
+
+ grx_open(640,480,8);
+ group_activate(MOUSEGROUP);
+ do
+ {
+ c = keyb_getch(BLOCK);
+ } while (c != ESC);
+
+ task_nopreempt();
+ sys_end();
+ return 0;
+}
+
+/* the buffer b is scannedc to search for numbers
+ at the first non-number the function stops */
+void geti(char *b, int *pos, int *res)
+{
+ // skip first chars
+ while (!isdigit(b[*pos]))
+ (*pos)++;
+
+
+ // read the numbers
+ *res = 0;
+ do {
+ *res = (*res * 10) + b[*pos] - '0';
+ (*pos)++;
+ } while (isdigit(b[*pos]));
+}
+
+void read_cfg_file(int argc, char **argv)
+{
+ int i, err, Temp1, Temp2, Temp3, Temp4, Temp5;
+ DOS_FILE *fp;
+ char myfilebuf[1000];
+ int myfilebuf_length;
+
+ int pos = 0;
+
+ if (argc==2) {
+ fp = DOS_fopen(argv[1],"r");
+
+ if (fp) {
+ /* read up to 1000 chars */
+ myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Read %d bytes...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading file...Using default values\n", err);
+ }
+ else
+ {
+ geti(myfilebuf, &pos, &NMouses); // Number of Mouses
+ for (i=0;i<NMouses;i++) {
+ geti(myfilebuf, &pos, &Temp1); // Mouse X coordinate
+ geti(myfilebuf, &pos, &Temp2); // Mouse Y coordinate
+ geti(myfilebuf, &pos, &Temp3); // Mouse radius
+ geti(myfilebuf, &pos, &Temp4); // Mouse orientation
+ Init_Mouse(i, Temp1, Temp2, Temp3, Temp4, 6);
+ }
+ geti(myfilebuf, &pos, &Temp1); // Beacon X coordinate
+ geti(myfilebuf, &pos, &Temp2); // Beacon Y coordinate
+ geti(myfilebuf, &pos, &Temp3); // Beacon intensity
+ geti(myfilebuf, &pos, &i); // Number of boxs
+ Init_Maze(Temp1, Temp2, Temp3, i);
+ for(; i>0; i--) {
+ geti(myfilebuf, &pos, &Temp1); // Box X1 Coordinate
+ geti(myfilebuf, &pos, &Temp2); // Box Y1 Coordinate
+ geti(myfilebuf, &pos, &Temp3); // Box X2 Coordinate
+ geti(myfilebuf, &pos, &Temp4); // Box Y2 Coordinate
+ geti(myfilebuf, &pos, &Temp5); // Type of Box
+ if (Temp5)
+ Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_BLOCK);
+ else
+ Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_NON_BLOCK);
+ }
+ DOS_fclose(fp);
+ return;
+ }
+ }
+ else {
+ /* error!! */
+ err = DOS_error();
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening myfile.txt...Using default values\n", err);
+ }
+
+ // Default value if no file is passed
+ NMouses=2;
+ Init_Maze(500, 350, 400, 1);
+ Init_Box(0, 200, 200, 300, 250, BOX_NON_BLOCK);
+ Init_Mouse(0, 100, 100, 15, 45, 6);
+ Init_Mouse(1, 100, 150, 15, 90, 6);
+ }
+ else {
+ cprintf("Wrong number of arguments...\n");
+ l1_exit(0);
+ }
+}
Index: branches/pj/robots/lab.txt
===================================================================
--- branches/pj/robots/lab.txt (nonexistent)
+++ branches/pj/robots/lab.txt (revision 1085)
@@ -0,0 +1,10 @@
+2
+530 380 15 270
+480 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: branches/pj/robots/makefile
===================================================================
--- branches/pj/robots/makefile (nonexistent)
+++ branches/pj/robots/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS = mouse2
+
+include $(BASE)/config/example.mk
+
+mouse2:
+ make -f $(SUBMAKE) APP=mouse2 INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
Index: branches/pj/robots/readme
===================================================================
--- branches/pj/robots/readme (nonexistent)
+++ branches/pj/robots/readme (revision 1085)
@@ -0,0 +1,9 @@
+Robots demo
+-----------
+
+This demo has been developed in the University of Alveiro, Portugal.
+
+See the included PDF files for more informations.
+
+Paolo
+pj@sssup.it
Index: branches/pj/auto/utils.c
===================================================================
--- branches/pj/auto/utils.c (nonexistent)
+++ branches/pj/auto/utils.c (revision 1085)
@@ -0,0 +1,131 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: utils.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+#include "include/auto.h"
+#include "include/utils.h"
+#include <string.h>
+#include <stdlib.h>
+
+float rand_01()
+{
+ return (((float)(rand()%20) / 100.0) + 0.8);
+}
+
+int rand_color()
+{
+ return (rand()%16);
+}
+
+int round(float value)
+{
+ return ((int)(value + 0.5));
+}
+
+void reverse(char s[]) {
+ int c, i, j;
+
+ for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
+ c = s[i];
+ s[i] = s[j];
+ s[j] = c;
+ }
+}
+
+char * itoa(int n, char *s) {
+ int i, sign;
+
+ if ((sign = n) < 0)
+ n = -n;
+ i = 0;
+
+ do {
+ s[i++] = n % 10 + '0';
+ } while ((n /= 10) > 0);
+
+ if (sign < 0)
+ s[i++] = '-';
+ s[i] = 0;
+
+ reverse(s);
+
+ return s;
+}
+
+time int2time(int t)
+{
+ time ts;
+
+ ts.dec = t % 10;
+ ts.sec = (t/10) % 60;
+ ts.min = (int)(t / 600);
+
+ return ts;
+}
+
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/auto/include/utils.h
===================================================================
--- branches/pj/auto/include/utils.h (nonexistent)
+++ branches/pj/auto/include/utils.h (revision 1085)
@@ -0,0 +1,76 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: utils.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Useful functions */
+/* ------------------ */
+
+#ifndef __UTILS_H_
+
+#define __UTILS_H_
+
+float rand_01();
+int rand_color();
+int round(float value);
+char * itoa(int n, char *s);
+void reverse(char s[]);
+time int2time(int t);
+
+#endif
Index: branches/pj/auto/include/const.h
===================================================================
--- branches/pj/auto/include/const.h (nonexistent)
+++ branches/pj/auto/include/const.h (revision 1085)
@@ -0,0 +1,141 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Useful constants */
+/* ------------------ */
+
+#ifndef __CONST_H_
+
+#define __CONST_H_
+
+/* Screen dimensions */
+#define SCREEN_WIDTH 800
+#define SCREEN_HEIGHT 600
+#define SCREEN_BIT_COLORS 8
+
+/* Visible area */
+#define TEL_WIDTH 50
+#define TEL_HEIGHT 50
+
+/* Car dimensions */
+#define CAR_WIDTH 12
+#define CAR_HEIGHT 12
+#define CAR_W 8
+#define CAR_H 10
+
+/* Track dimensions */
+#define TRACK_WIDTH 500
+#define TRACK_HEIGHT 500
+
+/* Track position */
+#define TRACK_X1 0
+#define TRACK_Y1 0
+#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
+#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
+
+/* Max number of car on track */
+#define MAX_CAR_NUMBER 10
+#define DRIVERS_NUMBER 20
+#define MAX_DRIVER_NAME_LENGTH 20
+#define MAX_TRACK_NAME_LENGTH 20
+#define TRACK_NUMBER 4
+
+/* Lap direction */
+#define CLOCK 0
+#define ANTICLOCK 1
+
+/* Information display coords */
+#define CMD_WIDTH TRACK_WIDTH
+#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
+
+/* Car position limits */
+#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
+#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
+#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
+#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
+
+/* Road constants */
+#define LEFT_ONLY 10
+#define RIGHT_ONLY 11
+#define ROAD_OK 12
+#define NO_ROAD 13
+
+/* Collision constants */
+#define COLLISION_LEFT 20
+#define COLLISION_RIGHT 21
+#define COLLISION_BACK 22
+#define NO_COLL 0
+
+/* CAB constants */
+#define ROAD_MSG_DIM sizeof(road_info)
+#define ROAD_MSG_READER 4
+
+#define CAR_MSG_DIM sizeof(car_status)
+#define CAR_MSG_READER 5
+
+/* Tasks parameters */
+#define SENSOR_WCET 3000
+#define SENSOR_PERIOD 40000
+#define CONTROL_WCET 1000
+#define CONTROL_PERIOD 40000
+
+#endif
+
Index: branches/pj/auto/include/auto.h
===================================================================
--- branches/pj/auto/include/auto.h (nonexistent)
+++ branches/pj/auto/include/auto.h (revision 1085)
@@ -0,0 +1,188 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: auto.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------- */
+/* Useful structures */
+/* ------------------- */
+
+#ifndef __CAR_H_
+
+#define __CAR_H_
+
+#include <modules/cabs.h>
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/types.h>
+#include <drivers/keyb.h>
+#include <drivers/glib.h>
+#include <semaphore.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "const.h"
+
+#define degree_to_rad(a) ((M_PI/180.0)*(a))
+#define rad_to_degree(a) ((180.0/M_PI)*(a))
+
+typedef struct {
+ int x;
+ int y;
+} point;
+
+typedef struct {
+ float x,y;
+} point_f;
+
+typedef struct {
+ float mod;
+ float phase;
+} vector;
+
+typedef struct {
+ point_f pos;
+ float orient;
+} car_status;
+
+typedef struct {
+ int left_border;
+ int right_border;
+ int distance;
+ float curve;
+ point opps_list[MAX_CAR_NUMBER];
+ int opps_number;
+ int collision;
+ int flag;
+} road_info;
+
+typedef struct {
+ int left,center,right;
+} road_strip;
+
+typedef struct {
+ PID sensor_pid,control_pid;
+ int number;
+ char driver[MAX_DRIVER_NAME_LENGTH];
+ float max_speed, min_acc, max_acc;
+ float rage;
+ CAB road_status_cab;
+ CAB car_status_cab;
+ int color;
+} car_params;
+
+typedef struct {
+ char name[MAX_TRACK_NAME_LENGTH]; // il nome del file
+ point pole_pos; // la posizione di partenza
+ float pole_orient; // la direzione di partenza
+ int lap; // il senso di marcia: CLOCK, ANTICLOCK
+ int selected; // it's a flag marking the actually selected track
+} track;
+
+typedef struct {
+ int min;
+ int sec;
+ int dec;
+} time;
+
+extern car_params cars[MAX_CAR_NUMBER];
+extern char track_img[TRACK_WIDTH*TRACK_HEIGHT];
+extern track track_list[TRACK_NUMBER];
+
+/* ---------------------------------------- */
+/* Functions definition */
+/* ---------------------------------------- */
+
+/* CABs R/W functions */
+int set_car_status(car_status, CAB); // sends the new status according to the control law
+car_status get_car_status(CAB); // reads car status from a CAB
+int set_road_info(road_info, CAB); // sends the new road informations
+road_info get_road_info(CAB); // reads road status values from a CAB
+
+/* Keyboard functions */
+void keyb_handler();
+void endfun(KEY_EVT *);
+void my_close(void *);
+
+/* Display functions */
+void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
+void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
+void cmd_display();
+
+/* Closing function */
+void byebye();
+void error_msg();
+
+/* Tasks */
+TASK sensor(); // Camera car task
+TASK control(); // Car controller task
+TASK manual(); // Manual driving task
+TASK actuator(); // Graphic drawing task
+TASK info(); // Car informations display task
+
+/* Tasks management */
+void hard_car_create();
+void soft_car_create();
+void killcar();
+
+/* Tracks management */
+int track_init();
+
+#endif
+
Index: branches/pj/auto/tracks/monaco.raw
===================================================================
--- branches/pj/auto/tracks/monaco.raw (nonexistent)
+++ branches/pj/auto/tracks/monaco.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/tracks/brazil.raw
===================================================================
--- branches/pj/auto/tracks/brazil.raw (nonexistent)
+++ branches/pj/auto/tracks/brazil.raw (revision 1085)
@@ -0,0 +1,2 @@
+ +!"#
\ No newline at end of file
Index: branches/pj/auto/tracks/demo1.raw
===================================================================
--- branches/pj/auto/tracks/demo1.raw (nonexistent)
+++ branches/pj/auto/tracks/demo1.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/tracks/demo2.raw
===================================================================
--- branches/pj/auto/tracks/demo2.raw (nonexistent)
+++ branches/pj/auto/tracks/demo2.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/jetctrl.c
===================================================================
--- branches/pj/auto/jetctrl.c (nonexistent)
+++ branches/pj/auto/jetctrl.c (revision 1085)
@@ -0,0 +1,155 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * this file is directly derived from the demos/jumpball/jetctrl.c .
+ * I just added this controls to check when the system will become overloaded
+ */
+
+#define WCET_JETDUMMY 200
+#define PERIOD_JETDUMMY 100000
+#define DUMMY_PID 1
+
+#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
+#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
+
+/* the point (x, y) is the top left corner */
+#define JET_DUMMY_X (TRACK_X1+360)
+#define JET_DUMMY_Y (TRACK_Y2+32)
+
+// JetControl
+
+#include "semaphore.h"
+#include "include/const.h"
+#include "kernel/func.h"
+#include "drivers/glib.h"
+
+extern sem_t grx_mutex;
+
+/* useful colors... */
+int white;
+int black;
+extern int red;
+extern int lightgray;
+
+TASK jetdummy_task(void *arg)
+{
+ TIME now_dummy, last_dummy, diff_dummy, slice;
+ struct timespec now, last, diff;
+ int x = 0;
+ int height;
+
+ NULL_TIMESPEC(&last);
+ last_dummy = 0;
+ for (;;) {
+ task_nopreempt();
+ jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
+ sys_gettime(&now);
+ task_preempt();
+
+ SUBTIMESPEC(&now, &last, &diff);
+ slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
+ diff_dummy = now_dummy - last_dummy;
+
+ height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
+
+ TIMESPEC_ASSIGN(&last, &now);
+ last_dummy = now_dummy;
+
+ sem_wait(&grx_mutex);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
+ JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
+ JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
+ grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
+ JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
+ sem_post(&grx_mutex);
+
+ x = (x+1)%JET_DUMMY_WIDTH;
+
+ task_endcycle();
+ }
+}
+
+void init_jetcontrol(void)
+{
+ SOFT_TASK_MODEL m4;
+
+ PID p4;
+
+ /* useful colors ... */
+ white = WHITE;
+ black = BLACK;
+
+ /* scenario */
+ sem_wait(&grx_mutex);
+ grx_text("System load",
+ JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
+ grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
+ JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
+
+ grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
+ grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
+
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
+ sem_post(&grx_mutex);
+
+ /* jetdummy task */
+ soft_task_default_model(m4);
+ soft_task_def_period(m4, PERIOD_JETDUMMY);
+ soft_task_def_met(m4, WCET_JETDUMMY);
+ soft_task_def_usemath(m4);
+ p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
+ if (p4 == -1) {
+ grx_close();
+ perror("Could not create task <jetdummy>");
+ sys_end();
+ }
+ task_activate(p4);
+}
+
Index: branches/pj/auto/cars/car2.raw
===================================================================
--- branches/pj/auto/cars/car2.raw (nonexistent)
+++ branches/pj/auto/cars/car2.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car3.raw
===================================================================
--- branches/pj/auto/cars/car3.raw (nonexistent)
+++ branches/pj/auto/cars/car3.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car4.raw
===================================================================
--- branches/pj/auto/cars/car4.raw (nonexistent)
+++ branches/pj/auto/cars/car4.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car5.raw
===================================================================
--- branches/pj/auto/cars/car5.raw (nonexistent)
+++ branches/pj/auto/cars/car5.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car6.raw
===================================================================
--- branches/pj/auto/cars/car6.raw (nonexistent)
+++ branches/pj/auto/cars/car6.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/boom.raw
===================================================================
--- branches/pj/auto/cars/boom.raw (nonexistent)
+++ branches/pj/auto/cars/boom.raw (revision 1085)
@@ -0,0 +1 @@
+      
\ No newline at end of file
Index: branches/pj/auto/cars/car7.raw
===================================================================
--- branches/pj/auto/cars/car7.raw (nonexistent)
+++ branches/pj/auto/cars/car7.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car8.raw
===================================================================
--- branches/pj/auto/cars/car8.raw (nonexistent)
+++ branches/pj/auto/cars/car8.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car9.raw
===================================================================
--- branches/pj/auto/cars/car9.raw (nonexistent)
+++ branches/pj/auto/cars/car9.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car10.raw
===================================================================
--- branches/pj/auto/cars/car10.raw (nonexistent)
+++ branches/pj/auto/cars/car10.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/fumo.raw
===================================================================
--- branches/pj/auto/cars/fumo.raw (nonexistent)
+++ branches/pj/auto/cars/fumo.raw (revision 1085)
@@ -0,0 +1 @@
+!!!!!!!!!!!!!!!!!!!!!!
\ No newline at end of file
Index: branches/pj/auto/cars/car11.raw
===================================================================
--- branches/pj/auto/cars/car11.raw (nonexistent)
+++ branches/pj/auto/cars/car11.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car12.raw
===================================================================
--- branches/pj/auto/cars/car12.raw (nonexistent)
+++ branches/pj/auto/cars/car12.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car13.raw
===================================================================
--- branches/pj/auto/cars/car13.raw (nonexistent)
+++ branches/pj/auto/cars/car13.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car14.raw
===================================================================
--- branches/pj/auto/cars/car14.raw (nonexistent)
+++ branches/pj/auto/cars/car14.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car15.raw
===================================================================
--- branches/pj/auto/cars/car15.raw (nonexistent)
+++ branches/pj/auto/cars/car15.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car0.raw
===================================================================
--- branches/pj/auto/cars/car0.raw (nonexistent)
+++ branches/pj/auto/cars/car0.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/cars/car1.raw
===================================================================
--- branches/pj/auto/cars/car1.raw (nonexistent)
+++ branches/pj/auto/cars/car1.raw (revision 1085)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: branches/pj/auto/auto.c
===================================================================
--- branches/pj/auto/auto.c (nonexistent)
+++ branches/pj/auto/auto.c (revision 1085)
@@ -0,0 +1,533 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: auto.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+int car_number;
+car_params cars[MAX_CAR_NUMBER];
+char drivers[DRIVERS_NUMBER][MAX_DRIVER_NAME_LENGTH] = {
+ "M.Schumacher",
+ "D.Coulthard",
+ "R.Schumacher",
+ "M.Hakkinen",
+ "R.Barrichello",
+ "J.P.Montoya",
+ "E.Irvine",
+ "J.Trulli",
+ "H.Frentzen",
+ "J.Villeneuve",
+ "J.Alesi",
+ "G.Fisichella",
+ "O.Panis",
+ "O.Wurz",
+ "J.Button",
+ "P.P.Diniz",
+ "P.De La Rosa",
+ "T.Marques",
+ "R.Zonta",
+ "G.Mazzacane"
+};
+
+extern char sprite[18][CAR_WIDTH*CAR_HEIGHT];
+
+/* Semaphores */
+sem_t grx_mutex;
+
+/* Useful colors */
+int red = rgb16(255, 0, 0);
+int green = rgb16( 0, 255, 0);
+int blue = rgb16( 0, 0, 255);
+int lightgray = rgb16(192, 192, 192);
+
+/* JetCTRL Initialization */
+void init_jetcontrol(void);
+
+/* -------------------------------------------------------*/
+
+/* --------------------- */
+/* Handling car status */
+/* --------------------- */
+
+int set_car_status(car_status cs, CAB cab_id) {
+ char *msg;
+
+ msg = cab_reserve(cab_id);
+ memcpy(msg, &cs, CAR_MSG_DIM);
+ return(cab_putmes(cab_id, msg));
+}
+
+car_status get_car_status(CAB cab_id) {
+ char *msg;
+ car_status status;
+
+ msg = cab_getmes(cab_id);
+ memcpy(&status, msg, CAR_MSG_DIM);
+ cab_unget(cab_id, msg);
+
+ return (status);
+}
+
+/* ---------------------------- */
+/* Handling road informations */
+/* ---------------------------- */
+
+int set_road_info(road_info info, CAB road_status_cab) {
+ char *msg;
+
+ msg = cab_reserve(road_status_cab);
+ memcpy(msg, &info, ROAD_MSG_DIM);
+ return(cab_putmes(road_status_cab, msg));
+}
+
+road_info get_road_info(CAB road_status_cab) {
+ char *msg;
+ road_info info;
+
+ msg = cab_getmes(road_status_cab);
+ memcpy(&info, msg, ROAD_MSG_DIM);
+ cab_unget(road_status_cab, msg);
+
+ return (info);
+}
+
+/* -------------------------------------------------------*/
+
+/* Closing function */
+void byebye()
+{
+ grx_close();
+
+ // we need clear to reposition the cursor in the right place after
+ // going back from the graphical mode.
+ clear();
+
+ kern_printf("Race is over!\n");
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* Hard car creation */
+/* ------------------- */
+
+void hard_car_create() {
+ car_params cp;
+ HARD_TASK_MODEL sensor_m, control_m;
+ PID sensor_pid, control_pid;
+ TIME seed; /* used to init the random seed */
+ int drv_ind;
+
+ if (car_number >= MAX_CAR_NUMBER) return;
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ /* CAB creation */
+ cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
+ cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
+
+ /* Car parameters initialization */
+ cp.max_speed = rand_01();
+ cp.min_acc = cp.max_speed;
+ cp.max_acc = cp.max_speed;
+ cp.rage = cp.max_speed;
+ cp.color = 3+car_number;
+ cp.number = car_number;
+ drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
+
+ /* Sets driver's name without duplications */
+ strcpy(cp.driver, drivers[drv_ind]);
+ while (!strcmp(cp.driver,"***"))
+ strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
+ strcpy(drivers[drv_ind],"***");
+
+ cars[car_number] = cp;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ /* sensor task creation */
+ hard_task_default_model(sensor_m);
+
+ hard_task_def_arg(sensor_m, (void *)car_number);
+ hard_task_def_wcet(sensor_m, SENSOR_WCET);
+ hard_task_def_mit(sensor_m, SENSOR_PERIOD);
+ hard_task_def_usemath(sensor_m);
+ sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
+ if(sensor_pid == -1)
+ sys_end();
+
+ /* control task creation */
+ hard_task_default_model(control_m);
+ hard_task_def_arg(control_m, (void *)car_number);
+ hard_task_def_wcet(control_m, CONTROL_WCET);
+ hard_task_def_mit(control_m, CONTROL_PERIOD);
+ hard_task_def_usemath(control_m);
+ control_pid = task_create("controller", control, &control_m, NULL);
+ if(control_pid == -1)
+ sys_end();
+
+ cars[car_number].sensor_pid = sensor_pid;
+ cars[car_number].control_pid = control_pid;
+ car_number++; // increases cars number
+
+ task_activate(sensor_pid);
+ task_activate(control_pid);
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* Soft car creation */
+/* ------------------- */
+
+void soft_car_create() {
+ car_params cp;
+ SOFT_TASK_MODEL sensor_m, control_m;
+ PID sensor_pid, control_pid;
+ TIME seed; /* used to init the random seed */
+ int drv_ind;
+
+ if (car_number >= MAX_CAR_NUMBER) return;
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ /* CAB creation */
+ cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
+ cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
+
+ /* Car parameters initialization */
+ cp.max_speed = rand_01();
+ cp.min_acc = cp.max_speed;
+ cp.max_acc = cp.max_speed;
+ cp.rage = cp.max_speed;
+ cp.color = 8+car_number;
+ cp.number = car_number;
+ drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
+
+ /* Sets driver's name without duplications */
+ strcpy(cp.driver, drivers[drv_ind]);
+ while (!strcmp(cp.driver,"***"))
+ strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
+ strcpy(drivers[drv_ind],"***");
+ cars[car_number] = cp;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ /* sensor task creation */
+ soft_task_default_model(sensor_m);
+
+ soft_task_def_arg(sensor_m, (void *)car_number);
+ soft_task_def_met(sensor_m, SENSOR_WCET);
+ soft_task_def_period(sensor_m, SENSOR_PERIOD);
+ soft_task_def_usemath(sensor_m);
+ sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
+ if(sensor_pid == -1)
+ sys_end();
+
+ /* control task creation */
+ soft_task_default_model(control_m);
+ soft_task_def_arg(control_m, (void *)car_number);
+ soft_task_def_met(control_m, CONTROL_WCET);
+ soft_task_def_period(control_m, CONTROL_PERIOD);
+ soft_task_def_usemath(control_m);
+ control_pid = task_create("controller", control, &control_m, NULL);
+ if(control_pid == -1)
+ sys_end();
+
+ cars[car_number].sensor_pid = sensor_pid;
+ cars[car_number].control_pid = control_pid;
+ car_number++; // increases cars number
+
+ task_activate(sensor_pid);
+ task_activate(control_pid);
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* The main function */
+/* ------------------- */
+
+int main(int argc, char **argv) {
+ TIME seed; /* used to init the random seed */
+
+ if (MAX_CAB < 30) {
+ cprintf("The application needs at least 30 CABS.\n"
+ "Please set the MAX_CAB #define to 30 or more...\n"
+ "...(see include/modules/cabs.h)\n");
+ sys_end();
+ }
+
+ /* Set the exception handler */
+ set_exchandler_grx();
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* Keyboard handling */
+ keyb_handler();
+ kern_printf("KEYBOARD initialized...\n");
+
+ /* Graphics mutex */
+ sem_init(&grx_mutex, 0, 1);
+
+ /* Graphics init */
+ grx_init();
+ grx_open(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BIT_COLORS);
+
+ /* Track drawing */
+ sem_wait(&grx_mutex);
+ grx_setcolor(46,0,0,0);
+ grx_setcolor(43,255,255,255);
+ grx_setcolor(26,255,74,33);
+ grx_setcolor(27,255,255,255);
+ grx_setcolor(1,8,8,8);
+ grx_setcolor(3,255,0,0);
+ grx_setcolor(28,255,50,0);
+ grx_setcolor(29,255,90,0);
+ grx_setcolor(30,255,130,0);
+ grx_setcolor(31,255,170,0);
+ grx_setcolor(32,255,210,0);
+ grx_setcolor(33,48,48,48);
+
+ grx_putimage(TRACK_X1, TRACK_Y1, TRACK_X2, TRACK_Y2, track_img);
+ sem_post(&grx_mutex);
+
+ /* Command and info display */
+ cmd_display();
+
+ /* JetCTRL Initialization */
+ init_jetcontrol();
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ car_number = 0;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ hard_car_create();
+
+ return 0;
+}
+
+/* -------------------------------------------------------*/
+
+void read_track(int i)
+{
+ DOS_FILE *f; // DOS file descriptor
+ int file_length;
+ int index;
+ char filename[100];
+ int err; // Error code
+
+ /* Init track_list */
+ track_init();
+
+ /* Set the selected track from track_list */
+ if (i < TRACK_NUMBER)
+ index = i;
+ else
+ index = 0;
+ cprintf("Selected index = %d\n", index);
+
+ strcpy(filename, strcat("tracks/", track_list[index].name));
+ cprintf("File to open = %s\n", filename);
+ track_list[index].selected = 1;
+
+ /* open the DOS file for reading (you can specify only "r" or "w") */
+ f = DOS_fopen(filename,"r");
+
+ /* check for open errors */
+ if (!f) {
+ err = DOS_error(); // error!!
+
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening %s...\n", err, filename);
+ file_length = 0;
+ byebye();
+ return;
+ }
+
+ /* read track file */
+ file_length = DOS_fread(&track_img, 1, TRACK_WIDTH*TRACK_HEIGHT, f);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Read %d bytes from %s...\n", file_length, filename);
+
+ if (err) {
+ cprintf("Error %d reading %s...\n", err, filename);
+ file_length = 0;
+ /* there is not return because I want to close the file! */
+ }
+
+ /* Close the file */
+ cprintf("Closing file %s...\n", filename);
+ DOS_fclose(f);
+ cprintf("File %s closed successfully!\n", filename);
+
+}
+
+/* -------------------------------------------------------*/
+
+void read_sprites()
+{
+ /* DOS file descriptor */
+ DOS_FILE *f;
+ int myfilebuf_length,i;
+ char filename[100];
+
+ /* Error code */
+ int err;
+ i=0;
+
+ for ( i=0; i < 16; i++) {
+ sprintf(filename,"cars/car%d.raw",i);
+ f = DOS_fopen(filename,"r");
+
+ // check for open errors
+ if (!f) {
+ // error!!
+ err = DOS_error();
+
+ // note that if you call DOS_error() here, it return 0!!!
+ cprintf("Error %d opening %s...\n", err, filename);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ // read from file
+ myfilebuf_length = DOS_fread(&sprite[i][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ // check for errors
+ err = DOS_error();
+
+ cprintf("Read %d bytes from %s...\n", myfilebuf_length, filename);
+
+ if (err) {
+ cprintf("Error %d reading %s...\n", err, filename);
+ myfilebuf_length = 0;
+ // there is not return because I want to close the file!
+ }
+
+ // Close the file
+ DOS_fclose(f);
+ }
+
+ f = DOS_fopen("cars/boom.raw","r");
+ if (!f) {
+ err = DOS_error();
+
+ cprintf("Error %d opening boom.raw...\n", err);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ myfilebuf_length = DOS_fread(&sprite[16][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ err = DOS_error();
+
+ cprintf("Read %d bytes from boom.raw...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading boom.raw...\n", err);
+ myfilebuf_length = 0;
+ }
+
+ DOS_fclose(f);
+
+ f = DOS_fopen("cars/fumo.raw","r");
+ if (!f) {
+ err = DOS_error();
+
+ cprintf("Error %d opening fumo.raw...\n", err);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ myfilebuf_length = DOS_fread(&sprite[17][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ err = DOS_error();
+
+ cprintf("Read %d bytes from fumo.raw...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading fumo.raw...\n", err);
+ myfilebuf_length = 0;
+ }
+
+ DOS_fclose(f);
+
+}
+
Index: branches/pj/auto/sensor.c
===================================================================
--- branches/pj/auto/sensor.c (nonexistent)
+++ branches/pj/auto/sensor.c (revision 1085)
@@ -0,0 +1,650 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: sensor.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------ */
+/* Camera car */
+/* ------------ */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+#include <drivers/glib.h>
+
+#define RADIUS 1
+#define TOLL_FACTOR 4.0
+#define MIN_DIFF 3
+#define ROAD_COLOR 27
+#define OFFROAD_COLOR 0
+#define DEBUG_COLOR GREEN
+#define OUT_OF_TRACK 230
+#define STRIP_DEFAULT TEL_WIDTH+1
+
+extern sem_t grx_mutex;
+extern car_params cars[MAX_CAR_NUMBER];
+
+void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor);
+void get_camera_car(BYTE *buffer, car_status status);
+int find_track(BYTE *image, road_info *info);
+int find_opps(BYTE *image, road_info *info);
+void find_collision(BYTE *image, road_info *info, car_status status);
+
+/* ----------------------------------------------------------------- */
+
+TASK sensor(int index) {
+ car_status actual_car_status; // the actual car state
+ road_info actual_road_info; // the actual road informations
+ BYTE image[TEL_WIDTH*TEL_HEIGHT]; // buffer contenente la visione della telecamera ruotata
+
+ point sq1, sq2;
+ point im1, im2;
+
+ CAB road_status_cab = cars[index].road_status_cab;
+ CAB car_status_cab = cars[index].car_status_cab;
+
+ // Draws display squares
+ sq1.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT;
+ sq1.y = TEL_HEIGHT*index + 1 + index;
+ sq2.x = sq1.x + TEL_WIDTH + 1;
+ sq2.y = sq1.y + TEL_HEIGHT + 1;
+
+ // Sets viewer coords
+ im1.x = sq1.x + 1;
+ im1.y = sq1.y + 1;
+ im2.x = im1.x + TEL_WIDTH - 1;
+ im2.y = im1.y + TEL_HEIGHT - 1;
+
+ // Inizializza il cab della strada
+ actual_road_info.left_border = TEL_WIDTH/2;
+ actual_road_info.right_border = TEL_WIDTH/2;
+ actual_road_info.distance = TEL_HEIGHT;
+ actual_road_info.curve = 0.0;
+ actual_road_info.opps_number = 0;
+ actual_road_info.flag = ROAD_OK;
+ actual_road_info.collision = NO_COLL;
+ set_road_info(actual_road_info, road_status_cab);
+
+ task_endcycle();
+
+ while(1) {
+ /* reads car informations */
+ actual_car_status = get_car_status(car_status_cab);
+
+ /* implementazione riconoscimento strada (sti cazzi!!!) */
+ get_camera_car(image, actual_car_status);
+ find_track(image, &actual_road_info);
+ find_opps(image, &actual_road_info);
+ find_collision(image, &actual_road_info, actual_car_status);
+
+ sem_wait(&grx_mutex);
+ grx_rect(sq1.x, sq1.y, sq2.x, sq2.y, cars[index].color);
+ grx_putimage(im1.x, im1.y, im2.x, im2.y, image);
+ sem_post(&grx_mutex);
+
+ /* sends informations to control task */
+ set_road_info(actual_road_info, road_status_cab);
+ task_endcycle();
+ }
+
+}
+
+/* ----------------------------------------------------------------- */
+
+void find_collision(BYTE *image, road_info *info, car_status status)
+{
+ point_f lt,rt,lb,rb,ct;
+ /* the lines used to scan the quadrilate */
+ point_f height_line[CAR_HEIGHT];
+ int i;
+ BYTE pix;
+
+ info->collision = NO_COLL;
+
+ ct.x = status.pos.x + (float)(CAR_HEIGHT/2 + 1) * cos(degree_to_rad(status.orient));
+ ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
+
+ lb.x = ct.x - (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ rb.x = ct.x + (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ lt.x = lb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
+ rt.x = rb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
+
+ lb.y = ct.y - (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ rb.y = ct.y + (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ lt.y = lb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
+ rt.y = rb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
+
+ sem_wait(&grx_mutex);
+ scanline(height_line,rb.x,rb.y,rt.x,rt.y,CAR_HEIGHT);
+ for (i=0; i < CAR_HEIGHT; i++) {
+ pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
+ if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
+ info->collision = COLLISION_RIGHT;
+ }
+ scanline(height_line,lb.x,lb.y,lt.x,lt.y,CAR_HEIGHT);
+ for (i=0; i < CAR_HEIGHT; i++) {
+ pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
+ if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
+ info->collision = COLLISION_LEFT;
+ }
+ sem_post(&grx_mutex);
+
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Puts in a buffer the image viewed from the camera according to the car status */
+void get_camera_car(BYTE *buffer, car_status status) {
+ /*
+ * lt ------ rt
+ * | |
+ * | |
+ * lb --ct-- rb
+ */
+ point_f lt,rt,lb,rb,ct;
+ /* the lines used to scan the quadrilate */
+ point_f width_line[TEL_WIDTH];
+ point_f height_line[TEL_HEIGHT];
+ int i,j;
+ int tmpx,tmpy,tx,ty;
+ float x,y;
+ BYTE *row;
+
+ ct.x = status.pos.x + (float)(CAR_WIDTH/2 + 1) * cos(degree_to_rad(status.orient));
+ ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
+
+ /* for now the visual starts from the center of the car */
+ lb.x = ct.x - (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ rb.x = ct.x + (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ lt.x = lb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
+ rt.x = rb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
+
+ lb.y = ct.y - (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ rb.y = ct.y + (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ lt.y = lb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
+ rt.y = rb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
+
+ /* scan only 2 sense thanks to parallelism */
+ /* ^ <-(height)
+ * ! lt
+ * ! |
+ * ! |
+ * ! lb ------ rb )
+ * 0 -------------> <-(width
+ */
+ /* the width_line coordinates are relative, so in the for cycle
+ they are summarized to absolute height_line values */
+ scanline(width_line,0,0,rb.x - lb.x,rb.y - lb.y,TEL_WIDTH);
+ scanline(height_line,lb.x,lb.y,lt.x,lt.y,TEL_HEIGHT);
+
+ /* First fill row TEL_HEIGHT-1 of image and so on until row 0 */
+ sem_wait(&grx_mutex);
+ for (i=0; i < TEL_HEIGHT; i++) {
+ x = height_line[i].x;
+ y = height_line[i].y;
+ row = &buffer[TEL_WIDTH * (TEL_HEIGHT-1-i)];
+ for (j=0; j < TEL_WIDTH; j++) {
+ tmpx = round(x + width_line[j].x);
+ tmpy = round(y + width_line[j].y);
+
+ // Test rispetto ai bordi
+ if (tmpx >= 0 && tmpx < SCREEN_WIDTH && tmpy >= 0 && tmpy < SCREEN_HEIGHT) {
+ tx = tmpx - TRACK_X1-1;
+ ty = tmpy - TRACK_Y1-1;
+ if (tx >= 0 && tx < TRACK_WIDTH && ty >= 0 && ty < TRACK_HEIGHT)
+ row[j] = grx_getpixel(tmpx,tmpy);
+ else
+ row[j] = OUT_OF_TRACK;
+ } else {
+ row[j] = OUT_OF_TRACK;
+ }
+ }
+ }
+ sem_post(&grx_mutex);
+}
+
+/* ----------------------------------------------------------------- */
+
+void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor) {
+ int i;
+ float x,y;
+ float xstep,ystep;
+
+ xstep = (x2 - x1) / factor;
+ ystep = (y2 - y1) / factor;
+
+ // Start scan at <x1, y1>
+ x = x1;
+ y = y1;
+
+ for (i = 0; i < factor; i++) {
+ buffer[i].x = x;
+ buffer[i].y = y;
+ x += xstep;
+ y += ystep;
+ }
+}
+
+/* ----------------------------------------------------------------- */
+
+/*
+ * Approssima la curva quando non è più possibile farlo con la scansione
+ * orizzontale
+ * - image
+ * - index l'indice da cui cominciare la ricerca della curva
+ * - distance la distanza dalla curva
+ */
+float approx_curve(BYTE *image, int index, int distance, int d_center, road_strip *strips) {
+ BYTE *p,tmp;
+ int i,j,k,ctrl=0;
+ point ms_center,ct;
+
+ // Decide se la curva e' verso sinistra o verso destra
+ p = &image[(TEL_HEIGHT - index - 1) * TEL_WIDTH];
+
+ ms_center.x = strips[index-1].left;
+ for (i = 0; i < min(3,strips[index-1].left); i++) {
+ // La curva è a destra
+ tmp = *(p + round(ms_center.x) - i);
+ if (tmp != ROAD_COLOR) {
+ ms_center.x = strips[index-1].right;
+ break;
+ }
+ }
+
+ p += round(ms_center.x);
+ // Scandisce la colonna fino alla fine della strada
+ for (i = index; i < TEL_HEIGHT; i++, p -= TEL_WIDTH) {
+ if (*p != ROAD_COLOR) break;
+ }
+
+ // Imposta il nuovo max_scost empirico
+ ms_center.y = (i-1 + index) / 2;
+
+ // i-1 è l'indice dell'ultima riga bianca
+ p = &image[(TEL_HEIGHT - (i-1) - 1) * TEL_WIDTH + round(ms_center.x)];
+ // scandisce da destra a sinistra
+ if (round(ms_center.x) > 0) {
+ for (j = 0; j < (round(ms_center.x) - strips[index-1].left); j++, p--) {
+ if (*p != ROAD_COLOR) break;
+ // scandisce dall'alto in basso finchè non trova nero
+ for (k = i-1; k > index; k--) {
+ tmp = *(p + (i-1-k)*TEL_WIDTH);
+ if (tmp != ROAD_COLOR) {
+ ms_center.y = (k + index) / 2;
+ ctrl = 1;
+ break;
+ }
+ }
+ if (ctrl) break;
+ }
+ ct.x = ms_center.x - j/2;
+ ct.y = ms_center.y;
+ } else {
+ // scandisce da sinistra a destra
+ for (j = 0; j < (strips[index-1].right - round(ms_center.x)); j++, p++) {
+ if (*p != ROAD_COLOR) break;
+ // scandisce dall'alto in basso finchè non trova nero
+ for (k = i-1; k > index; k--) {
+ tmp = *(p + (i-1-k)*TEL_WIDTH);
+ if (tmp != ROAD_COLOR) {
+ ms_center.y = (k + index) / 2;
+ ctrl = 1;
+ break;
+ }
+ }
+ if (ctrl) break;
+ }
+ ct.x = ms_center.x + j/2;
+ ct.y = ms_center.y;
+ }
+
+ return rad_to_degree(atan2((double)(ct.y - distance),(double)(ct.x - d_center)));
+}
+
+/* ----------------------------------------------------------------- */
+
+int find_distance(road_strip *strips, int max_scost, int rett_tol) {
+ int i, distance;
+ int center_car = TEL_WIDTH/2;
+
+ // La distanza non puo' essere maggiore del max_scost
+ distance = max_scost;
+
+ for (i=1; i < max_scost; i++) {
+ // Calcola la distanza dalla curva
+ if (abs(strips[i].center - center_car) > rett_tol) {
+ distance = i;
+ break;
+ }
+ }
+ return distance;
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Scandisce la linea row e inserisce nella strip index le informazioni.
+ * Ritorna 1 se trova entrambi i bordi, altrimenti 0
+ */
+int scan_strip(BYTE *row, int index, road_strip *strips) {
+ // Tiene conto della posizione dei bordi precedenti per trattare
+ // meglio il caso di curve molto strette, dove possono esistere
+ // 2 bordi destri o sinistri
+
+ // Per evitare problemi nei casi in cui siano possibili 2
+ // bordi destri o sinistri
+ int lfound = 0;
+ int rfound = 0;
+ int center_car = TEL_WIDTH/2;
+ int i;
+
+ // Parte dal secondo pixel e finisce al penultimo
+ for(i=1; i < (TEL_WIDTH-1); i++) {
+ // Se trova la strada controlla se si tratta di bordo
+ // destro o sinistro
+ if (row[i] == ROAD_COLOR) {
+ // bordo sinistro
+ if (row[i - 1] != ROAD_COLOR) {
+ // Se ho già trovato questo tipo di bordo cerco
+ // quello + plausibile ...
+ if (lfound) {
+ // Test sulla striscia precedente
+ if (index > 0) {
+ if (abs(i - strips[index-1].left) <
+ abs(strips[index].left - strips[index-1].left))
+ strips[index].left = i;
+ } else {
+ // Test sul centro della macchina
+ if (abs(i - center_car) < abs(strips[0].left - center_car))
+ strips[index].left = i;
+ }
+ lfound++;
+ } else {
+ // ... altrimenti lo inizializzo
+ strips[index].left = i;
+ lfound = 1;
+ }
+ // bordo destro
+ } else if ((row[i + 1] != ROAD_COLOR) && lfound) {
+ // Se ho già trovato questo tipo di bordo cerco
+ // quello + plausibile ...
+ if (rfound) {
+ // Test sulla striscia precedente
+ if (index > 0) {
+ if (abs(i - strips[index-1].right) <
+ abs(strips[index].right - strips[index-1].right))
+ strips[index].right = i;
+ } else {
+ // Test sul centro della macchina
+ if (abs(i - center_car) < abs(strips[0].right - center_car))
+ strips[index].right = i;
+ }
+ rfound++;
+ } else {
+ // ... altrimenti lo inizializzo
+ strips[index].right = i;
+ rfound = 1;
+ }
+ }
+ }
+ }
+
+ // Calcola il centro della strada se trova i bordi
+ if (lfound && rfound)
+ strips[index].center = (strips[index].left + strips[index].right) / 2;
+
+ return (lfound && rfound);
+}
+
+/* ----------------------------------------------------------------- */
+
+void where_am_i(BYTE *row, road_strip strip, road_info *info) {
+ int i;
+ int lfound = 0;
+ int rfound = 0;
+ int car_center = TEL_WIDTH/2;
+
+ for(i=1; i < (TEL_WIDTH-1); i++) {
+ // Se trova la strada controlla se si tratta di bordo
+ // destro o sinistro
+ if (row[i] == ROAD_COLOR) {
+ // bordo sinistro
+ if (row[i - 1] != ROAD_COLOR) {
+ strip.left = i;
+ lfound = 1;
+ break;
+ } else if (row[i + 1] != ROAD_COLOR) {
+ strip.right = i;
+ rfound = 1;
+ break;
+ }
+ }
+ }
+
+ if (lfound && rfound) {
+ info->flag = ROAD_OK;
+ }
+ else if (lfound && !rfound) info->flag = LEFT_ONLY;
+ else if (!lfound && rfound) info->flag = RIGHT_ONLY;
+ else {
+ if (row[car_center] == OFFROAD_COLOR) info->flag = NO_ROAD;
+ else info->flag = ROAD_OK;
+ }
+ info->left_border = car_center - strip.left;
+ info->right_border = strip.right - car_center;
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Analizza l'immagine vista dalla telecamera inserendo le informazioni
+ * necessarie in info, ovvero la distanza dai bordi destro e sinistro,
+ * la distanza dalla prossima curva e il suo angolo di curvatura.
+ * Per il momento ritorna -1 se non riesce a trovare entrambi i bordi della
+ * strada; in futuro gestiremo anche questa situazione.
+ */
+int find_track(BYTE *image, road_info *info) {
+ // vettore contenente le informazioni su ogni striscia
+ road_strip strips[TEL_HEIGHT];
+ BYTE *row;
+ int car_center = TEL_WIDTH/2;
+ int max_scost=0;
+ int once_scost=0;
+ int j, rett_tol=0;
+
+ info->flag = ROAD_OK;
+
+ strips[0].left = STRIP_DEFAULT;
+ strips[0].right = STRIP_DEFAULT;
+ /* Tratta in modo personalizzato il primo tratto di strada per
+ inizializzare alcune variabili e per capire situazioni particolari */
+ row = &image[(TEL_HEIGHT - 1)*TEL_WIDTH];
+ // Se trova i bordi ...
+ if (scan_strip(row,0,strips)) {
+ // ... calcola i bordi della strada e ...
+ info->left_border = car_center - strips[0].left;
+ info->right_border = strips[0].right - car_center;
+ // ... inizializza la tolleranza per il rettilineo.
+ rett_tol = (strips[0].right - strips[0].left) / TOLL_FACTOR;
+ } else {
+ // Se non trova il bordo ...
+ // Mi sono perso, cercami la strada
+ where_am_i(row,strips[0],info);
+ return 1;
+ }
+
+ /* Ora controlla le altre strisce della strada */
+
+ for(j=1; j < TEL_HEIGHT ; j++) {
+ row = &image[(TEL_HEIGHT - j - 1)*TEL_WIDTH];
+ // Se trova i bordi ...
+ if (scan_strip(row, j, strips)) {
+ // ... aggiorna l'indice di max scostamento.
+ if (abs(strips[j].center - car_center) >
+ abs(strips[max_scost].center - car_center)
+ && abs(strips[j].center - car_center) > rett_tol) {
+
+ max_scost = j;
+ once_scost=1; // ha trovato almeno un max scost
+ }
+ } else {
+ // Se max_scost non è mai stato settato, prendo il max
+ if (!once_scost) {
+ max_scost = j-1;
+ once_scost = 1;
+ }
+
+ // se la distanza e il max_scost sono troppo vicini approssima la curva
+ info->distance = find_distance(strips, max_scost, rett_tol);
+ if ((max_scost - info->distance) < MIN_DIFF) {
+ info->curve = approx_curve(image, j, info->distance,
+ strips[info->distance].center,strips) - 90.0;
+ return 1;
+ }
+ break;
+ }
+ }
+
+ // Se max_scost non è mai stato settato, prendo il max
+ if (!once_scost) max_scost = TEL_HEIGHT-1;
+ max_scost = min(max_scost,TEL_HEIGHT-1);
+
+ info->distance = find_distance(strips,max_scost,rett_tol);
+
+ // calcola l'angolo di curvatura solo se il conto e' attendibile
+ if ((info->distance < (TEL_HEIGHT*0.9)) &&
+ ((max_scost - info->distance) >= MIN_DIFF))
+ info->curve = rad_to_degree(atan2((double)(max_scost - info->distance),
+ (double)(strips[max_scost].center - strips[info->distance].center)));
+ else {
+ // se i conti sono empirici, si guarda la posizione dei due centri
+ if (strips[max_scost].center > strips[info->distance].center)
+ info->curve = 88.0;
+ else if (strips[max_scost].center < strips[info->distance].center)
+ info->curve = 92.0;
+ else
+ info->curve = 90.0;
+ }
+ info->curve -= 90.0;
+ return 0;
+}
+
+/* ----------------------------------------------------------------- */
+
+int find_opps(BYTE *image, road_info *info)
+{
+ int i, j;
+ int l_limit, r_limit; // the opposite empiric limits
+ BYTE *row;
+ int car_center = TEL_WIDTH/2;
+ int opps_number = 0;
+
+ // by default it needs to scan the entire row
+ l_limit = TEL_WIDTH - 1;
+ r_limit = 0;
+
+ // Scans one row at a time
+ for(j=1; j<TEL_HEIGHT; j++) {
+ row = &image[(TEL_HEIGHT - j - 1) * TEL_WIDTH];
+
+ // if some of the previous row has been identified as a car...
+ if (opps_number > 0 &&
+ j < (info->opps_list[opps_number - 1].y + CAR_HEIGHT + 1)) {
+ // excludes CAR_HEIGHT lines from the bottom if the car
+ l_limit = (car_center + info->opps_list[opps_number - 1].x) - CAR_WIDTH;
+ r_limit = (car_center + info->opps_list[opps_number - 1].x) + CAR_WIDTH;
+ }
+ else {
+ // it needs to scan the entire row
+ l_limit = TEL_WIDTH - 1;
+ r_limit = 0;
+ }
+
+ // Scans the current row
+ for (i=0; i<TEL_WIDTH; i++) {
+ if( (i < l_limit || i > r_limit) &&
+ row[i] != ROAD_COLOR && row[i] != OFFROAD_COLOR &&
+ row[i] != DEBUG_COLOR && row[i] != OUT_OF_TRACK) {
+ // there is an opponent car!!
+ // stores its position
+ info->opps_list[opps_number].x = i - car_center; // left -, right +
+ info->opps_list[opps_number].y = j;
+
+ // increases number of opposites car in the sensor view range
+ opps_number++;
+ }
+ }
+ }
+
+ info->opps_number = opps_number;
+
+ return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/auto/readme
===================================================================
--- branches/pj/auto/readme (nonexistent)
+++ branches/pj/auto/readme (revision 1085)
@@ -0,0 +1,51 @@
+AUTO - Another Unuseful Track simulatOr
+---------------------------------------
+
+by Marco Dallera and Marco Fiocca, 2001
+
+---------------------------------------
+
+This project was done as a Lab assignment during the course of
+"Informatica Industriale" at the University of Pavia, Italy.
+
+It simulates a race between cars under a set of 4 tracks.
+
+The authors provided also some pages that describes the application
+(auto.ps, in italian, on the website).
+
+To run the application, just compile it and call "x auto th" where tn is
+the track number (0 to 4).
+
+Since the control algorithm is quite complex, you need a quite powerful
+machine. If you get an exception 8 (WCET violation), you need a faster PC.
+You can anyway run the application making "auto2", that uses RR instead of
+EDF or CBS, or "auto3", that uses the EDFACT Module (you need yo copy
+the edfact.c and edfact.h files in the application directory to do that).
+
+To be run, the application needs to be compiled with the
+#define MAX_CAB set to a number greater than 20 (see include/modules/cabs.h).
+
+The control algorithm of the cars is not yet perfect, and if you look to
+the race for a long time, sometimes some cars go in the wrong direction.
+If you find a better algorithm, send me a patch :-)
+
+The code you can find in this directory is the original code of the
+students except for the MAX_CAB test into main(), and for the idle time
+monitor (that I took from the jumpball example) that can be useful to know
+when the system is overloaded. For example, on my PC there is idle time until
+the system has 9 cars. The tenth make the PC overloaded until one of them
+crashes :-).
+
+Finally note that the WCET and PERIODS specified by the authors are not so
+correct, and with this setting you can run 8 cars maximum before crashing the
+system.
+
+Have a nice race...
+
+Paolo
+pj@sssup.it
+
+PS: Sometimes on my portable the demo crashes. I wonder why!... If someone
+finds why, please tell me, I will patch it...
+
+
Index: branches/pj/auto/initfil1.c
===================================================================
--- branches/pj/auto/initfil1.c (nonexistent)
+++ branches/pj/auto/initfil1.c (revision 1085)
@@ -0,0 +1,108 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil1.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(2);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
Index: branches/pj/auto/initfil2.c
===================================================================
--- branches/pj/auto/initfil2.c (nonexistent)
+++ branches/pj/auto/initfil2.c (revision 1085)
@@ -0,0 +1,108 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil2.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/rr.h"
+#include "modules/rrsoft.h"
+#include "modules/dummy.h"
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(0);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
+
+
+
+
Index: branches/pj/auto/control.c
===================================================================
--- branches/pj/auto/control.c (nonexistent)
+++ branches/pj/auto/control.c (revision 1085)
@@ -0,0 +1,711 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: control.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------- */
+/* Car control */
+/* ------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+#define TURN_QUANTUM 2
+#define KM 18.0 // pixel
+#define HOUR 3600.0 // seconds
+#define KPH (KM/HOUR) // 0.005 pixel/second
+#define HIGHWAY_LIMIT 6
+#define MAZE_LIMIT 45
+#define CURVE_LIMIT 25 // il limite della curva per cui imposta la traiettoria
+#define BORDER_LIMIT ((1.0 / params.rage) * 2.0)
+#define STEERING_LIMIT 3 // limite di sterzata
+
+/* Road state */
+#define HIGHWAY 1
+#define MIXED 2
+#define MAZE 3
+#define CENTER 10
+#define TOO_LEFT 11
+#define TOO_RIGHT 12
+
+/* Opponents relationship */
+#define ATTACK 20
+#define DEFENSE 21
+#define SUPERATTACK 22
+
+/* Car parameters */
+#define MAX_SPEED (300 * KPH)
+#define MIN_SPEED (10 * KPH)
+#define MIN_ACC (-0.1)
+#define MAX_ACC (0.02)
+
+extern sem_t grx_mutex;
+
+char track_img[TRACK_WIDTH*TRACK_HEIGHT];
+char sprite[18][CAR_WIDTH*CAR_HEIGHT];
+
+/* Display functions */
+void put_transimage(int x1, int y1, int x2, int y2, BYTE *img,int car_color, int color);
+void draw_car(point_f old_pos, car_status cs, int car_color, int fumo);
+void put_trackbox(int x1, int y1, int x2, int y2);
+void show_display(int, int, float, float, float, float);
+void car_crash(PID sp, PID cp, point_f old_pos, int free);
+
+/* ------------------------------------------------------------------ */
+
+TASK control(int index) {
+ int i = 0; // general purpose counter
+ car_status old_car_status; // the previous car state
+ car_status actual_car_status; // the actual car state
+ road_info actual_road_info; // the actual road informations
+ int road_state; // the state of the road: HIGHWAY, MIXED; MAZE
+ int car_align; // the car alignment with respect to road limits
+ int opps_state; // the relationship with other cars
+ float old_speed = 0; // the previous car speed value
+ float actual_speed = 0; // the actual car speed value
+ float old_acc = 0; // the previous acceleration value
+ float acc = 0; // the new acceleration
+ point polepos;
+
+ // Variabili che dipendono dal tipo di macchina
+ float max_speed; // maximum car speed
+ float min_acc; // minimum acceleration
+ float max_acc; // maximum acceleration
+
+ int killed = 0; // flag for killed cars
+ int crashed = 0; // flag for crashed cars
+
+ /* Timing variables */
+ float t = 0;
+ float dt = (float)CONTROL_PERIOD/100000.0; // time quantum
+ time ts = int2time(t);
+ float crash_t = 0;
+ time crash_ts = int2time(crash_t);
+ float bestlap = 999999999.9;
+ time bestlap_s = int2time(bestlap);
+ int bestlap_done = 0;
+ int laps = 0;
+
+ /* Display vars */
+ point spd_p, acc_p, time_p, drv_p;
+ char *txt;
+
+ /* Car data */
+ car_params params; // car data structure
+
+ /* ----------------------------------------------------- */
+
+ txt = (char *)malloc(15*sizeof(char));
+
+ params = cars[index];
+
+ max_speed = params.max_speed * MAX_SPEED; // maximum car speed
+ min_acc = params.min_acc * MIN_ACC; // minimum acceleration
+ max_acc = params.max_acc * MAX_ACC; // maximum acceleration
+
+ /* Get track data */
+ while (track_list[i].selected == 0)
+ i++;
+
+ /* Same pole for all */
+ polepos.x = track_list[i].pole_pos.x;
+ polepos.y = track_list[i].pole_pos.y;
+ actual_car_status.pos.x = polepos.x;
+ actual_car_status.pos.y = polepos.y;
+ actual_car_status.orient = track_list[i].pole_orient;
+ set_car_status(actual_car_status, params.car_status_cab);
+
+ /* Initialize old values */
+ old_car_status = actual_car_status;
+ old_acc = acc;
+ old_speed = actual_speed;
+
+ /* POWER IS NOTHING WITHOUT CONTROL */
+ while(1) {
+
+ if (crashed) {
+ crash_t += dt;
+ crash_ts = int2time(crash_t);
+ if (crash_ts.sec > 2) {
+ car_crash(params.sensor_pid,params.control_pid,
+ old_car_status.pos, 1);
+ killed=1;
+ }
+ }
+
+ else {
+
+ /* Reads road informations */
+ actual_road_info = get_road_info(params.road_status_cab);
+
+ /* Defines the state of the road */
+ if (fabs(actual_road_info.curve) < HIGHWAY_LIMIT ||
+ actual_road_info.distance > 0.9*TEL_HEIGHT) {
+ road_state = HIGHWAY;
+ } else if (fabs(actual_road_info.curve) > MAZE_LIMIT ||
+ actual_road_info.distance < 0.1*TEL_HEIGHT) {
+ road_state = MAZE;
+ } else {
+ road_state = MIXED;
+ }
+
+ /* Defines the car position whitin road borders */
+ if (actual_road_info.left_border < BORDER_LIMIT)
+ car_align = TOO_LEFT;
+ else if (actual_road_info.right_border < BORDER_LIMIT)
+ car_align = TOO_RIGHT;
+ else car_align = CENTER;
+
+ /* Sets the power percentage */
+ switch (road_state)
+ {
+ case HIGHWAY:
+ acc = max_acc; // tarella!!!!
+ break;
+ case MIXED:
+ actual_speed = params.rage * (((float)actual_road_info.distance/(float)TEL_HEIGHT) /
+ (fabs(actual_road_info.curve)/90.0)) * max_speed;
+ acc = (actual_speed - old_speed) / dt;
+ break;
+ case MAZE:
+ actual_speed = params.rage * (1.0 - (fabs(actual_road_info.curve)/90.0)) * max_speed;
+ acc = (actual_speed - old_speed) / dt;
+ break;
+ default:
+ acc = 0.0;
+ }
+
+ /* Can't go off road */
+ /* When car is near a border, it steers to come in */
+ switch (car_align)
+ {
+ case TOO_LEFT:
+ actual_car_status.orient -= TURN_QUANTUM;
+ break;
+ case TOO_RIGHT:
+ actual_car_status.orient += TURN_QUANTUM;
+ break;
+ }
+
+ if (road_state != HIGHWAY) {
+ // C'e' una curva vicina.
+ // Se la curva e' a destra si tiene vicino al bordo di sinistra
+ // per impostare la traiettoria migliore e viceversa
+ if (actual_road_info.curve < 0 && actual_road_info.left_border > BORDER_LIMIT
+ && fabs(actual_road_info.curve) > CURVE_LIMIT)
+ actual_car_status.orient += TURN_QUANTUM;
+ else if (actual_road_info.curve > 0 && actual_road_info.right_border > BORDER_LIMIT
+ && fabs(actual_road_info.curve) > CURVE_LIMIT)
+ actual_car_status.orient -= TURN_QUANTUM;
+
+ // Fa la curva dolcemente
+ if (actual_road_info.distance < ((1.0/params.rage) * (TEL_HEIGHT * 0.25))) {
+ actual_car_status.orient += actual_road_info.curve * (params.rage/8.0);
+ //actual_car_status.orient += actual_road_info.curve / 4.0;
+ }
+ }
+
+ /* Defines the state of interactions with other cars */
+ if (actual_road_info.opps_number > 0)
+ {
+ if (road_state == HIGHWAY && actual_road_info.opps_list[0].y > (TEL_HEIGHT/3.0))
+ opps_state = ATTACK;
+ else if (road_state == MAZE && actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0))
+ opps_state = DEFENSE;
+ else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/6.0) &&
+ actual_road_info.opps_list[0].x != 0 &&
+ (abs(actual_road_info.opps_list[0].x) < CAR_W/2)) {
+ // Defends and steers to avoid opponents
+ opps_state = DEFENSE;
+ acc *= -((TEL_HEIGHT/6.0) / (actual_road_info.opps_list[0].y));
+ actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
+ abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM/2;
+ }
+ else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0) &&
+ actual_road_info.opps_list[0].x != 0 &&
+ abs(actual_road_info.opps_list[0].x) < CAR_W/2) {
+ // Attacks and steers to override the opponent
+ opps_state = ATTACK;
+ actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
+ abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM;
+ }
+ else
+ opps_state = DEFENSE;
+
+ // Response to opponents positions
+ if (opps_state == ATTACK)
+ acc = max_acc;
+ else if (opps_state == DEFENSE)
+ acc *= 0.5;
+ }
+
+
+ /* Checking car position: road/offroad */
+ if (actual_road_info.left_border * actual_road_info.right_border < 0)
+ acc = 0.5 * min_acc;
+
+ if (actual_road_info.flag != ROAD_OK) {
+ switch (actual_road_info.flag) {
+ case LEFT_ONLY:
+ if (actual_road_info.left_border < 0)
+ actual_car_status.orient -= TURN_QUANTUM;
+ acc = 0.5 * max_acc;
+ break;
+ case RIGHT_ONLY:
+ if (actual_road_info.right_border < 0)
+ actual_car_status.orient += TURN_QUANTUM;
+ acc = 0.5 * max_acc;
+ break;
+ case NO_ROAD:
+ crashed = 1;
+ car_crash(params.sensor_pid,params.control_pid,
+ old_car_status.pos, 0);
+ break;
+ }
+ }
+
+ /* Checking collisions... */
+ if (actual_road_info.collision != NO_COLL) {
+ switch(actual_road_info.collision) {
+ case COLLISION_LEFT:
+ actual_car_status.orient -= TURN_QUANTUM;
+ acc *= (0.5 * params.rage);
+ break;
+ case COLLISION_RIGHT:
+ actual_car_status.orient += TURN_QUANTUM;
+ acc *= (0.5 * params.rage);
+ break;
+ }
+ }
+
+ /* Checking acceleration range... */
+ acc = max(min(max_acc,acc),min_acc);
+ actual_speed = old_speed + acc*dt;
+
+ /* Checking speed range... */
+ actual_speed = min(max(actual_speed,MIN_SPEED),max_speed);
+
+ /* Checking steering angle ... */
+ if (fabs(actual_car_status.orient - old_car_status.orient) >
+ STEERING_LIMIT) {
+ if ((actual_car_status.orient - old_car_status.orient) > 0)
+ actual_car_status.orient = old_car_status.orient + STEERING_LIMIT;
+ else
+ actual_car_status.orient = old_car_status.orient - STEERING_LIMIT;
+ }
+
+ /* Setting new car position... */
+ actual_car_status.pos.x += actual_speed * cos(degree_to_rad(actual_car_status.orient));
+ actual_car_status.pos.y -= actual_speed * sin(degree_to_rad(actual_car_status.orient));
+
+ /* Checking track limits... */
+ if (actual_car_status.pos.x < MIN_CAR_X)
+ actual_car_status.pos.x = MIN_CAR_X;
+ if (actual_car_status.pos.x > MAX_CAR_X)
+ actual_car_status.pos.x = MAX_CAR_X;
+ if (actual_car_status.pos.y < MIN_CAR_Y)
+ actual_car_status.pos.y = MIN_CAR_Y;
+ if (actual_car_status.pos.y > MAX_CAR_Y)
+ actual_car_status.pos.y = MAX_CAR_Y;
+
+ /* Sends new status to car_status_cab */
+ set_car_status(actual_car_status, params.car_status_cab);
+
+ if (!crashed) {
+ /* Updates car */
+ if (acc == min_acc)
+ draw_car(old_car_status.pos,actual_car_status, params.color, 1);
+ else
+ draw_car(old_car_status.pos,actual_car_status, params.color, 0);
+ }
+
+ /* Sets display points */
+ spd_p.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT + TEL_WIDTH + 9;
+ spd_p.y = TEL_HEIGHT*index + 1 + index + 1;
+ bar_display(spd_p, 70, 4, GREEN, actual_speed, max_speed, LIGHTGRAY, "Spd");
+
+ acc_p.x = spd_p.x;
+ acc_p.y = spd_p.y + 24;
+ bidir_bar_display(acc_p, 70, 4, GREEN, acc, max(fabs(min_acc), max_acc), LIGHTGRAY, "Acc");
+
+ sem_wait(&grx_mutex);
+
+ /* Displays driver's name */
+ drv_p.x = spd_p.x + 80;
+ drv_p.y = spd_p.y;
+ grx_text(params.driver, drv_p.x, drv_p.y, params.color, BLACK);
+
+ /* Displays timer */
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 8;
+ if( (!bestlap_done) || (bestlap_done && t > 50))
+ {
+ /* Mins */
+ txt = itoa(ts.min, txt);
+ grx_text(txt, time_p.x, time_p.y, WHITE, BLACK);
+ grx_text(":", time_p.x + 8, time_p.y, WHITE, BLACK);
+ /* Secs */
+ txt = itoa(ts.sec, txt);
+ if (ts.sec < 10) {
+ grx_text("0", time_p.x+16, time_p.y, WHITE, BLACK);
+ grx_text(txt, time_p.x+24, time_p.y, WHITE, BLACK);
+ }
+ else
+ grx_text(txt, time_p.x+16, time_p.y, WHITE, BLACK);
+ /* Decs */
+ grx_text(":", time_p.x+32, time_p.y, WHITE, BLACK);
+ txt = itoa(ts.dec, txt);
+ grx_text(txt, time_p.x+40, time_p.y, WHITE, BLACK);
+ }
+
+ /* Displays the best lap */
+ if(bestlap_done == 1)
+ {
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 16;
+ /* Mins */
+ txt = itoa(bestlap_s.min, txt);
+ grx_text(txt, time_p.x, time_p.y, YELLOW, BLACK);
+ grx_text(":", time_p.x + 8, time_p.y, YELLOW, BLACK);
+ /* Secs */
+ txt = itoa(bestlap_s.sec, txt);
+ if (bestlap_s.sec < 10) {
+ grx_text("0", time_p.x+16, time_p.y, YELLOW, BLACK);
+ grx_text(txt, time_p.x+24, time_p.y, YELLOW, BLACK);
+ }
+ else
+ grx_text(txt, time_p.x+16, time_p.y, YELLOW, BLACK);
+ /* Decs */
+ grx_text(":", time_p.x+32, time_p.y, YELLOW, BLACK);
+ txt = itoa(bestlap_s.dec, txt);
+ grx_text(txt, time_p.x+40, time_p.y, YELLOW, BLACK);
+ }
+
+ /* Displays lap number */
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 24;
+ grx_text("Lap ", time_p.x, time_p.y, LIGHTGRAY, BLACK);
+ txt = itoa(laps, txt);
+ grx_text(txt, time_p.x+32, time_p.y, LIGHTGRAY, BLACK);
+
+ sem_post(&grx_mutex);
+
+ /* Control the best lap */
+ t += dt;
+ ts = int2time(t);
+
+ /* Finish line */
+ if ((track_list[i].lap == CLOCK &&
+ (actual_car_status.pos.x >= polepos.x) && (old_car_status.pos.x < polepos.x)
+ && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20)) ||
+ (track_list[i].lap == ANTICLOCK &&
+ (actual_car_status.pos.x <= polepos.x) && (old_car_status.pos.x > polepos.x)
+ && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20))) {
+ laps++; // increases lap number
+
+ bestlap = min(bestlap,t);
+ bestlap_s = int2time(bestlap);
+ bestlap_done = 1;
+ t = 0;
+ ts = int2time(t);
+ }
+
+ /* Updates old values */
+ old_car_status = actual_car_status;
+ old_acc = acc;
+ old_speed = actual_speed;
+
+ } // end crashed
+
+ task_endcycle();
+
+ // Esce se e' morto
+ if (killed) return 0;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void car_crash(PID sp, PID cp, point_f old_pos, int free)
+{
+ point p1, p2;
+ p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
+ p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
+ p2.x = p1.x + CAR_WIDTH + 1;
+ p2.y = p1.y + CAR_HEIGHT + 1;
+
+ sem_wait(&grx_mutex);
+ /* Find the track box to redraw */
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+
+ if (free == 0) {
+ // Draw the explosion
+ put_transimage(p1.x+1,p1.y+1,p2.x-1,p2.y-1,&sprite[16][0],0,0);
+ }
+ else if (free == 1) {
+ // Delete the explosion
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+ task_kill(sp);
+ task_kill(cp);
+ }
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void draw_car(point_f old_pos, car_status cs, int car_color, int fumo)
+{
+ int index;
+ point p1, p2;
+ p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
+ p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
+ p2.x = p1.x + CAR_WIDTH + 1;
+ p2.y = p1.y + CAR_HEIGHT + 1;
+
+ sem_wait(&grx_mutex);
+ /* Find the track box to redraw */
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+
+
+ p1.x = round(cs.pos.x) + (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
+ p1.y = round(cs.pos.y) - (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
+ p2.x = round(cs.pos.x) - (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
+ p2.y = round(cs.pos.y) + (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
+
+ index = ((((int)cs.orient%360)+360)%360);
+ index = (int)(index + 11.25)%360;
+ index /= 22.5;
+
+ put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
+ round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
+ &sprite[index][0], car_color, 0);
+ if (fumo)
+ put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
+ round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
+ &sprite[17][0], car_color, 0);
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+/* Copy a box of track_image to screen */
+void put_trackbox(int x1, int y1, int x2, int y2)
+{
+ int y;
+ int tx1,ty1,tx2,ty2;
+ BYTE *addr;
+
+ tx1 = x1-TRACK_X1+1;
+ ty1 = y1-TRACK_Y1;
+ tx2 = x2-TRACK_X1+1;
+ ty2 = y2-TRACK_Y1;
+
+ if (tx1 < 0) tx1 = 0;
+ if (ty1 < 0) ty1 = 0;
+ if (tx2 > TRACK_WIDTH-1) tx2 = TRACK_WIDTH-1;
+ if (ty2 > TRACK_HEIGHT-1) ty2 = TRACK_HEIGHT-1;
+
+ tx1 = max(tx1,0);
+ ty1 = max(ty1,0);
+ tx2 = min(tx2,TRACK_WIDTH-1);
+ ty2 = min(ty2,TRACK_HEIGHT-1);
+
+ addr = &track_img[0] + tx1 + TRACK_WIDTH * ty1;
+
+ x1 = max(0,x1);
+ y1 = max(0,y1);
+
+ for (y = y1; y <= y2; y++) {
+ grx_putimage(x1+1, y, x2, y, addr);
+ addr += TRACK_WIDTH;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void put_transimage(int x1, int y1, int x2, int y2, BYTE *img, int car_color,
+ int color)
+{
+ int x,y;
+ BYTE *addr;
+ addr = img;
+
+
+ for (y = y1; y < y2; y++) {
+ for ( x = x1; x < x2; x++, addr++) {
+ if (*addr != color) {
+ if (*addr == 26)
+ grx_plot(x,y,car_color);
+ else
+ grx_plot(x,y,*addr);
+
+ }
+ }
+ addr++;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void show_display(int rs, int ca, float speed, float max_speed,
+ float acc, float max_acc) {
+ point hw, mx, mz; // three road states
+ point tl, ct, tr; // three car alignments
+ point sp1, sp2; // speed display coordinates
+ point ap1, ap2; // acceleration display coordinates
+ int s_amp = 0;
+ int a_amp = 0;
+
+ /* Leds coordinates */
+ hw.x = 10;
+ hw.y = SCREEN_HEIGHT-50;
+ mx.x = 25;
+ mx.y = SCREEN_HEIGHT-50;
+ mz.x = 40;
+ mz.y = SCREEN_HEIGHT-50;
+ tl.x = 10;
+ tl.y = SCREEN_HEIGHT-35;
+ ct.x = 25;
+ ct.y = SCREEN_HEIGHT-35;
+ tr.x = 40;
+ tr.y = SCREEN_HEIGHT-35;
+ sp1.x = 10;
+ sp1.y = SCREEN_HEIGHT-75;
+ sp2.x = 110;
+ sp2.y = SCREEN_HEIGHT-65;
+ ap1.x = 10;
+ ap1.y = SCREEN_HEIGHT-90;
+ ap2.x = 110;
+ ap2.y = SCREEN_HEIGHT-80;
+
+ sem_wait(&grx_mutex);
+
+ /* Writes out controller titles */
+ grx_text("Road", mz.x+15, mz.y, YELLOW, BLACK);
+ grx_text("Curve", tr.x+15, tr.y, YELLOW, BLACK);
+ switch (rs)
+ {
+ case HIGHWAY:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, GREEN);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
+ break;
+ case MIXED:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, YELLOW);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
+ break;
+ case MAZE:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, RED);
+ break;
+ }
+
+ switch (ca)
+ {
+ case TOO_LEFT:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, RED);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
+ break;
+ case TOO_RIGHT:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLUE);
+ break;
+ default:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, WHITE);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
+ }
+
+ /* Draws speed display */
+ grx_text("Speed", sp1.x+120, sp1.y, YELLOW, BLACK);
+ grx_rect(sp1.x-1, sp1.y-1, sp2.x+1, sp2.y+1, GREEN);
+ /* Updates speed display */
+ grx_box(sp1.x, sp1.y, sp2.x, sp2.y, BLACK);
+ s_amp = round( (speed * (float)(sp2.x-sp1.x)) / max_speed );
+ grx_box(sp1.x, sp1.y, sp1.x+s_amp, sp2.y, LIGHTGRAY);
+
+ /* Draws acceleration display */
+ grx_text("Acceleration", ap1.x+120, ap1.y, YELLOW, BLACK);
+ grx_rect(ap1.x-1, ap1.y-1, ap2.x+1, ap2.y+1, GREEN);
+ /* Updates acceleration display */
+ grx_box(ap1.x, ap1.y, ap2.x, ap2.y, BLACK);
+ a_amp = round( (float)acc * (float)((ap2.x-ap1.x)/2) / (float)max_acc );
+ if (a_amp >= 0)
+ grx_box((ap1.x+ap2.x)/2, ap1.y, ((ap1.x+ap2.x)/2)+a_amp, ap2.y, LIGHTGRAY);
+ else
+ grx_box((ap1.x+ap2.x)/2+a_amp, ap1.y, ((ap1.x+ap2.x)/2), ap2.y, LIGHTGRAY);
+ grx_line((ap1.x+ap2.x)/2, ap1.y-2, (ap1.x+ap2.x)/2, ap2.y+2, WHITE);
+ sem_post(&grx_mutex);
+}
+
+
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/auto/initfil3.c
===================================================================
--- branches/pj/auto/initfil3.c (nonexistent)
+++ branches/pj/auto/initfil3.c (revision 1085)
@@ -0,0 +1,107 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil3.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "edfact.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDFACT_register_level(0);
+ CBS_register_level(0, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(2);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *) main(argc,argv);
+}
Index: branches/pj/auto/edfact.c
===================================================================
--- branches/pj/auto/edfact.c (nonexistent)
+++ branches/pj/auto/edfact.c (revision 1085)
@@ -0,0 +1,735 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: edfact.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "edfact.h"
+#include <ll/stdio.h>
+#include <ll/string.h>
+#include <kernel/model.h>
+#include <kernel/descr.h>
+#include <kernel/var.h>
+#include <kernel/func.h>
+#include <kernel/trace.h>
+
+//#define edfact_printf kern_printf
+#define edfact_printf printk
+
+/*+ Status used in the level +*/
+#define EDFACT_READY MODULE_STATUS_BASE /*+ - Ready status +*/
+#define EDFACT_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
+
+/*+ flags +*/
+#define EDFACT_FLAG_NORAISEEXC 2
+
+/*+ the level redefinition for the Earliest Deadline First level +*/
+typedef struct {
+ level_des l; /*+ the standard level descriptor +*/
+
+ TIME period[MAX_PROC]; /*+ The task periods; the deadlines are
+ stored in the priority field +*/
+ int deadline_timer[MAX_PROC];
+ /*+ The task deadline timers +*/
+
+ struct timespec deadline_timespec[MAX_PROC];
+
+ int dline_miss[MAX_PROC]; /*+ Deadline miss counter +*/
+ int wcet_miss[MAX_PROC]; /*+ Wcet miss counter +*/
+
+ int nact[MAX_PROC]; /*+ Wcet miss counter +*/
+
+ int flag[MAX_PROC];
+ /*+ used to manage the JOB_TASK_MODEL and the
+ periodicity +*/
+
+ QUEUE ready; /*+ the ready queue +*/
+
+ int flags; /*+ the init flags... +*/
+
+ bandwidth_t U; /*+ the used bandwidth +*/
+
+} EDFACT_level_des;
+
+
+static void EDFACT_timer_deadline(void *par);
+
+static void EDFACT_internal_activate(EDFACT_level_des *lev, PID p)
+{
+ TIMESPEC_ASSIGN(&proc_table[p].timespec_priority,
+ &proc_table[p].request_time);
+ ADDUSEC2TIMESPEC(lev->period[p], &proc_table[p].timespec_priority);
+
+ TIMESPEC_ASSIGN(&lev->deadline_timespec[p],
+ &proc_table[p].timespec_priority);
+
+ /* Insert task in the correct position */
+ proc_table[p].status = EDFACT_READY;
+ q_timespec_insert(p,&lev->ready);
+
+ /* needed because when there is a wcet miss I disable CONTROL_CAP */
+ proc_table[p].control |= CONTROL_CAP;
+}
+
+static char *EDFACT_status_to_a(WORD status)
+{
+ if (status < MODULE_STATUS_BASE)
+ return status_to_a(status);
+
+ switch (status) {
+ case EDFACT_READY : return "EDFACT_Ready";
+ case EDFACT_IDLE : return "EDFACT_Idle";
+ default : return "EDFACT_Unknown";
+ }
+}
+
+static void EDFACT_timer_deadline(void *par)
+{
+ PID p = (PID) par;
+ EDFACT_level_des *lev;
+
+ lev = (EDFACT_level_des *)level_table[proc_table[p].task_level];
+
+ switch (proc_table[p].status) {
+ case EDFACT_IDLE:
+ edfact_printf("I%d",p);
+ TIMESPEC_ASSIGN(&proc_table[p].request_time,
+ &proc_table[p].timespec_priority);
+
+ EDFACT_internal_activate(lev,p);
+
+ event_need_reschedule();
+ break;
+
+ default:
+ edfact_printf("D%d",p);
+ /* else, a deadline miss occurred!!! */
+ lev->dline_miss[p]++;
+
+ /* the task is into another state */
+ lev->nact[p]++;
+
+ /* Set the deadline timer */
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
+ }
+
+ /* Set the deadline timer */
+ lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
+ EDFACT_timer_deadline,
+ (void *)p);
+
+}
+
+static void EDFACT_timer_guest_deadline(void *par)
+{
+ PID p = (PID) par;
+
+ edfact_printf("AAARRRGGGHHH!!!");
+ kern_raise(XDEADLINE_MISS,p);
+}
+
+static int EDFACT_level_accept_task_model(LEVEL l, TASK_MODEL *m)
+{
+ if (m->pclass == HARD_PCLASS || m->pclass == (HARD_PCLASS | l)) {
+ HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
+
+ if (h->wcet && h->mit && h->periodicity == PERIODIC)
+ return 0;
+ }
+
+ return -1;
+}
+
+static int EDFACT_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
+{
+ if (m->pclass == JOB_PCLASS || m->pclass == (JOB_PCLASS | l))
+ return 0;
+ else
+ return -1;
+}
+
+
+static char *onoff(int i)
+{
+ if (i)
+ return "On ";
+ else
+ return "Off";
+}
+
+static void EDFACT_level_status(LEVEL l)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ PID p = lev->ready;
+
+ kern_printf("On-line guarantee : %s\n",
+ onoff(lev->flags & EDFACT_ENABLE_GUARANTEE));
+ kern_printf("Used Bandwidth : %u/%u\n",
+ lev->U, MAX_BANDWIDTH);
+
+ while (p != NIL) {
+ if ((proc_table[p].pclass) == JOB_PCLASS)
+ kern_printf("Pid: %2d (GUEST)\n", p);
+ else
+ kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
+ p,
+ proc_table[p].name,
+ "Period ",
+ lev->period[p],
+ proc_table[p].timespec_priority.tv_sec,
+ proc_table[p].timespec_priority.tv_nsec/1000,
+ EDFACT_status_to_a(proc_table[p].status));
+ p = proc_table[p].next;
+ }
+
+ for (p=0; p<MAX_PROC; p++)
+ if (proc_table[p].task_level == l && proc_table[p].status != EDFACT_READY
+ && proc_table[p].status != FREE )
+ kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
+ p,
+ proc_table[p].name,
+ "Period ",
+ lev->period[p],
+ proc_table[p].timespec_priority.tv_sec,
+ proc_table[p].timespec_priority.tv_nsec/1000,
+ EDFACT_status_to_a(proc_table[p].status));
+}
+
+/* The scheduler only gets the first task in the queue */
+static PID EDFACT_level_scheduler(LEVEL l)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+/* { // print 4 dbg the ready queue
+ PID p= lev->ready;
+ kern_printf("(s");
+ while (p != NIL) {
+ kern_printf("%d ",p);
+ p = proc_table[p].next;
+ }
+ kern_printf(") ");
+ }
+ */
+ return (PID)lev->ready;
+}
+
+/* The on-line guarantee is enabled only if the appropriate flag is set... */
+static int EDFACT_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ if (lev->flags & EDFACT_FAILED_GUARANTEE) {
+ *freebandwidth = 0;
+ return 0;
+ }
+ else
+ if (*freebandwidth >= lev->U) {
+ *freebandwidth -= lev->U;
+ return 1;
+ }
+ else
+ return 0;
+
+}
+
+static int EDFACT_task_create(LEVEL l, PID p, TASK_MODEL *m)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* if the EDFACT_task_create is called, then the pclass must be a
+ valid pclass. */
+
+ HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
+
+ lev->period[p] = h->mit;
+
+ lev->flag[p] = 0;
+ lev->deadline_timer[p] = -1;
+ lev->dline_miss[p] = 0;
+ lev->wcet_miss[p] = 0;
+ lev->nact[p] = 0;
+
+ /* Enable wcet check */
+ proc_table[p].avail_time = h->wcet;
+ proc_table[p].wcet = h->wcet;
+ proc_table[p].control |= CONTROL_CAP;
+
+ /* update the bandwidth... */
+ if (lev->flags & EDFACT_ENABLE_GUARANTEE) {
+ bandwidth_t b;
+ b = (MAX_BANDWIDTH / h->mit) * h->wcet;
+
+ /* really update lev->U, checking an overflow... */
+ if (MAX_BANDWIDTH - lev->U > b)
+ lev->U += b;
+ else
+ /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
+ in this case, we don't raise an exception... in fact, after the
+ EDFACT_task_create the task_create will call level_guarantee that return
+ -1... return -1 in EDFACT_task_create isn't correct, because:
+ . generally, the guarantee must be done when also the resources
+ are registered
+ . returning -1 will cause the task_create to return with an errno
+ ETASK_CREATE instead of ENO_GUARANTEE!!!
+
+ Why I use the flag??? because if the lev->U overflows, if i.e. I set
+ it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
+ */
+ lev->flags |= EDFACT_FAILED_GUARANTEE;
+ }
+
+ return 0; /* OK, also if the task cannot be guaranteed... */
+}
+
+static void EDFACT_task_detach(LEVEL l, PID p)
+{
+ /* the EDFACT level doesn't introduce any dinamic allocated new field.
+ we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
+ bandwidth */
+
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ if (lev->flags & EDFACT_FAILED_GUARANTEE)
+ lev->flags &= ~EDFACT_FAILED_GUARANTEE;
+ else
+ lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
+}
+
+static int EDFACT_task_eligible(LEVEL l, PID p)
+{
+ return 0; /* if the task p is chosen, it is always eligible */
+}
+
+static void EDFACT_task_dispatch(LEVEL l, PID p, int nostop)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task state is set EXE by the scheduler()
+ we extract the task from the ready queue
+ NB: we can't assume that p is the first task in the queue!!! */
+ q_extract(p, &lev->ready);
+}
+
+static void EDFACT_task_epilogue(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* check if the wcet is finished... */
+ if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
+ /* wcet finished: disable wcet event and count wcet miss */
+ edfact_printf("W%d",p);
+ proc_table[p].control &= ~CONTROL_CAP;
+ lev->wcet_miss[p]++;
+ }
+
+ /* the task it returns into the ready queue... */
+ q_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+}
+
+static void EDFACT_task_activate(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* Test if we are trying to activate a non sleeping task */
+ /* save activation (only if needed... */
+ if (proc_table[p].status != SLEEP) {
+ /* a periodic task cannot be activated when it is already active */
+ kern_raise(XACTIVATION,p);
+ return;
+ }
+
+ ll_gettime(TIME_EXACT, &proc_table[p].request_time);
+
+ EDFACT_internal_activate(lev,p);
+
+ /* Set the deadline timer */
+ lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
+ EDFACT_timer_deadline,
+ (void *)p);
+
+}
+
+static void EDFACT_task_insert(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* Insert task in the coEDFect position */
+ proc_table[p].status = EDFACT_READY;
+ q_timespec_insert(p,&lev->ready);
+}
+
+static void EDFACT_task_extract(LEVEL l, PID p)
+{
+}
+
+static void EDFACT_task_endcycle(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+
+ /* we reset the capacity counters... */
+ proc_table[p].avail_time = proc_table[p].wcet;
+
+ if (lev->nact[p] > 0) {
+ edfact_printf("E%d",p);
+
+ /* Pending activation: reactivate the thread!!! */
+ lev->nact[p]--;
+
+ /* see also EDFACT_timer_deadline */
+ ll_gettime(TIME_EXACT, &proc_table[p].request_time);
+
+ EDFACT_internal_activate(lev,p);
+
+ /* check if the deadline has already expired */
+ if (TIMESPEC_A_LT_B(&proc_table[p].timespec_priority, &schedule_time)) {
+ /* count the deadline miss */
+ lev->dline_miss[p]++;
+ event_delete(lev->deadline_timer[p]);
+ }
+
+ }
+ else {
+ edfact_printf("e%d",p);
+
+ /* the task has terminated his job before it consume the wcet. All OK! */
+ proc_table[p].status = EDFACT_IDLE;
+
+ /* when the deadline timer fire, it recognize the situation and set
+ correctly all the stuffs (like reactivation, request_time, etc... ) */
+ }
+}
+
+static void EDFACT_task_end(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ edfact_printf("Û%d",p);
+
+ /* we finally put the task in the ready queue */
+ proc_table[p].status = FREE;
+ q_insertfirst(p,&freedesc);
+ /* and free the allocated bandwidth */
+ lev->U -= (MAX_BANDWIDTH/lev->period[p]) * proc_table[p].wcet;
+
+ if (lev->deadline_timer[p] != -1) {
+ edfact_printf("²%d",p);
+ event_delete(lev->deadline_timer[p]);
+ }
+}
+
+static void EDFACT_task_sleep(LEVEL l, PID p)
+{ kern_raise(XUNVALID_TASK,exec_shadow); }
+
+static void EDFACT_task_delay(LEVEL l, PID p, TIME usdelay)
+{ kern_raise(XUNVALID_TASK,exec_shadow); }
+
+/* Guest Functions
+ These functions manages a JOB_TASK_MODEL, that is used to put
+ a guest task in the EDFACT ready queue. */
+
+static int EDFACT_guest_create(LEVEL l, PID p, TASK_MODEL *m)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ JOB_TASK_MODEL *job = (JOB_TASK_MODEL *)m;
+
+ /* if the EDFACT_guest_create is called, then the pclass must be a
+ valid pclass. */
+
+ TIMESPEC_ASSIGN(&proc_table[p].timespec_priority, &job->deadline);
+
+ lev->deadline_timer[p] = -1;
+ lev->dline_miss[p] = 0;
+ lev->wcet_miss[p] = 0;
+ lev->nact[p] = 0;
+
+ if (job->noraiseexc)
+ lev->flag[p] = EDFACT_FLAG_NORAISEEXC;
+ else
+ lev->flag[p] = 0;
+
+ lev->period[p] = job->period;
+
+ /* there is no bandwidth guarantee at this level, it is performed
+ by the level that inserts guest tasks... */
+
+ return 0; /* OK, also if the task cannot be guaranteed... */
+}
+
+static void EDFACT_guest_detach(LEVEL l, PID p)
+{
+ /* the EDFACT level doesn't introduce any dinamic allocated new field.
+ No guarantee is performed on guest tasks... so we don't have to reset
+ the NO_GUARANTEE FIELD */
+}
+
+static void EDFACT_guest_dispatch(LEVEL l, PID p, int nostop)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task state is set to EXE by the scheduler()
+ we extract the task from the ready queue
+ NB: we can't assume that p is the first task in the queue!!! */
+ q_extract(p, &lev->ready);
+}
+
+static void EDFACT_guest_epilogue(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task has been preempted. it returns into the ready queue... */
+ q_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+}
+
+static void EDFACT_guest_activate(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* Insert task in the correct position */
+ q_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+
+ /* Set the deadline timer */
+ if (!(lev->flag[p] & EDFACT_FLAG_NORAISEEXC))
+ lev->deadline_timer[p] = kern_event_post(&proc_table[p].timespec_priority,
+ EDFACT_timer_guest_deadline,
+ (void *)p);
+
+}
+
+static void EDFACT_guest_insert(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* Insert task in the correct position */
+ q_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+}
+
+static void EDFACT_guest_extract(LEVEL l, PID p)
+{
+}
+
+static void EDFACT_guest_endcycle(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void EDFACT_guest_end(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ //kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
+ if (proc_table[p].status == EDFACT_READY)
+ {
+ q_extract(p, &lev->ready);
+ //kern_printf("(g_end rdy extr)");
+ }
+
+ /* we remove the deadline timer, because the slice is finished */
+ if (lev->deadline_timer[p] != NIL) {
+// kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
+ event_delete(lev->deadline_timer[p]);
+ lev->deadline_timer[p] = NIL;
+ }
+
+}
+
+static void EDFACT_guest_sleep(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void EDFACT_guest_delay(LEVEL l, PID p, TIME usdelay)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+/* Registration functions */
+
+/*+ Registration function:
+ int flags the init flags ... see EDFACT.h +*/
+void EDFACT_register_level(int flags)
+{
+ LEVEL l; /* the level that we register */
+ EDFACT_level_des *lev; /* for readableness only */
+ PID i; /* a counter */
+
+ printk("EDFACT_register_level\n");
+
+ /* request an entry in the level_table */
+ l = level_alloc_descriptor();
+
+ printk(" alloco descrittore %d %d\n",l,(int)sizeof(EDFACT_level_des));
+
+ /* alloc the space needed for the EDFACT_level_des */
+ lev = (EDFACT_level_des *)kern_alloc(sizeof(EDFACT_level_des));
+
+ printk(" lev=%d\n",(int)lev);
+
+ /* update the level_table with the new entry */
+ level_table[l] = (level_des *)lev;
+
+ /* fill the standard descriptor */
+ strncpy(lev->l.level_name, EDFACT_LEVELNAME, MAX_LEVELNAME);
+ lev->l.level_code = EDFACT_LEVEL_CODE;
+ lev->l.level_version = EDFACT_LEVEL_VERSION;
+
+ lev->l.level_accept_task_model = EDFACT_level_accept_task_model;
+ lev->l.level_accept_guest_model = EDFACT_level_accept_guest_model;
+ lev->l.level_status = EDFACT_level_status;
+ lev->l.level_scheduler = EDFACT_level_scheduler;
+
+ if (flags & EDFACT_ENABLE_GUARANTEE)
+ lev->l.level_guarantee = EDFACT_level_guarantee;
+ else
+ lev->l.level_guarantee = NULL;
+
+ lev->l.task_create = EDFACT_task_create;
+ lev->l.task_detach = EDFACT_task_detach;
+ lev->l.task_eligible = EDFACT_task_eligible;
+ lev->l.task_dispatch = EDFACT_task_dispatch;
+ lev->l.task_epilogue = EDFACT_task_epilogue;
+ lev->l.task_activate = EDFACT_task_activate;
+ lev->l.task_insert = EDFACT_task_insert;
+ lev->l.task_extract = EDFACT_task_extract;
+ lev->l.task_endcycle = EDFACT_task_endcycle;
+ lev->l.task_end = EDFACT_task_end;
+ lev->l.task_sleep = EDFACT_task_sleep;
+ lev->l.task_delay = EDFACT_task_delay;
+
+ lev->l.guest_create = EDFACT_guest_create;
+ lev->l.guest_detach = EDFACT_guest_detach;
+ lev->l.guest_dispatch = EDFACT_guest_dispatch;
+ lev->l.guest_epilogue = EDFACT_guest_epilogue;
+ lev->l.guest_activate = EDFACT_guest_activate;
+ lev->l.guest_insert = EDFACT_guest_insert;
+ lev->l.guest_extract = EDFACT_guest_extract;
+ lev->l.guest_endcycle = EDFACT_guest_endcycle;
+ lev->l.guest_end = EDFACT_guest_end;
+ lev->l.guest_sleep = EDFACT_guest_sleep;
+ lev->l.guest_delay = EDFACT_guest_delay;
+
+ /* fill the EDFACT descriptor part */
+ for(i=0; i<MAX_PROC; i++) {
+ lev->period[i] = 0;
+ lev->deadline_timer[i] = -1;
+ lev->flag[i] = 0;
+ lev->dline_miss[i] = 0;
+ lev->wcet_miss[i] = 0;
+ lev->nact[i] = 0;
+ }
+
+ lev->ready = NIL;
+ lev->flags = flags & 0x07;
+ lev->U = 0;
+}
+
+bandwidth_t EDFACT_usedbandwidth(LEVEL l)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ return lev->U;
+ else
+ return 0;
+}
+
+int EDFACT_get_dline_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ return lev->dline_miss[p];
+ else
+ return -1;
+}
+
+int EDFACT_get_wcet_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ return lev->wcet_miss[p];
+ else
+ return -1;
+}
+
+int EDFACT_get_nact(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ return lev->nact[p];
+ else
+ return -1;
+}
+
+int EDFACT_reset_dline_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ {
+ lev->dline_miss[p] = 0;
+ return 0;
+ }
+ else
+ return -1;
+}
+
+int EDFACT_reset_wcet_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ if (lev->l.level_code == EDFACT_LEVEL_CODE &&
+ lev->l.level_version == EDFACT_LEVEL_VERSION)
+ {
+ lev->wcet_miss[p] = 0;
+ return 0;
+ }
+ else
+ return -1;
+}
+
Index: branches/pj/auto/tracks.c
===================================================================
--- branches/pj/auto/tracks.c (nonexistent)
+++ branches/pj/auto/tracks.c (revision 1085)
@@ -0,0 +1,111 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: tracks.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* -------------- */
+/* Track loader */
+/* -------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+
+track track_list[TRACK_NUMBER];
+
+int track_init()
+{
+ track demo1;
+ track demo2;
+ track brazil;
+ track monaco;
+
+ strcpy(demo1.name, "demo1.raw");
+ demo1.pole_pos.x = 150;
+ demo1.pole_pos.y = 35;
+ demo1.pole_orient = 0.0;
+ demo1.lap = CLOCK;
+ demo1.selected = 0;
+
+ strcpy(demo2.name, "demo2.raw");
+ demo2.pole_pos.x = 150;
+ demo2.pole_pos.y = 30;
+ demo2.pole_orient = 0.0;
+ demo2.lap = CLOCK;
+ demo2.selected = 0;
+
+ strcpy(brazil.name, "brazil.raw");
+ brazil.pole_pos.x = 140;
+ brazil.pole_pos.y = 185;
+ brazil.pole_orient = 225.0;
+ brazil.lap = ANTICLOCK;
+ brazil.selected = 0;
+
+ strcpy(monaco.name, "monaco.raw");
+ monaco.pole_pos.x = 35;
+ monaco.pole_pos.y = 315;
+ monaco.pole_orient = 85.0;
+ monaco.lap = CLOCK;
+ monaco.selected = 0;
+
+ track_list[0] = demo1;
+ track_list[1] = demo2;
+ track_list[2] = brazil;
+ track_list[3] = monaco;
+
+ return 0;
+}
Index: branches/pj/auto/keyb.c
===================================================================
--- branches/pj/auto/keyb.c (nonexistent)
+++ branches/pj/auto/keyb.c (revision 1085)
@@ -0,0 +1,105 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: keyb.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Keyboard handler */
+/* ------------------ */
+
+#include "include/auto.h"
+#include "include/const.h"
+
+
+void keyb_handler() {
+ KEY_EVT k;
+ keyb_set_map(itaMap);
+
+ /* Exit keys: ENTER */
+ k.flag = 0;
+ k.scan = KEY_ENT;
+ k.ascii = 13;
+ keyb_hook(k, endfun);
+
+ /* Creates a new HARD car */
+ k.flag = 0;
+ k.scan = KEY_H;
+ k.ascii = 'h';
+ keyb_hook(k, hard_car_create);
+
+ /* Creates a new SOFT car */
+ k.flag = 0;
+ k.scan = KEY_S;
+ k.ascii = 's';
+ keyb_hook(k, soft_car_create);
+}
+
+
+void endfun(KEY_EVT *k)
+{
+ grx_close();
+ cprintf("Ctrl-Brk pressed! Ending...\n");
+ sys_end();
+}
+
+
+void my_close(void *arg)
+{
+ kern_printf("my_close\n");
+}
+
Index: branches/pj/auto/info.c
===================================================================
--- branches/pj/auto/info.c (nonexistent)
+++ branches/pj/auto/info.c (revision 1085)
@@ -0,0 +1,154 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: info.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------- */
+/* Information panel */
+/* ------------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+extern sem_t grx_mutex;
+
+/* ------------------------------------------------------------------ */
+
+void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
+{
+ int background = BLACK;
+ int amp = 0;
+ point p2;
+
+ p2.x = p1.x + width;
+ p2.y = p1.y + height;
+
+ sem_wait(&grx_mutex);
+
+ grx_text(name, p1.x, p1.y + height + 3, color, background);
+ grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
+
+ grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
+ amp = abs(round( var * (float)(p2.x - p1.x) / max ));
+ grx_box(p1.x, p1.y, p1.x + amp, p2.y, color);
+
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
+{
+ int background = BLACK;
+ int amp = 0;
+ point p2;
+
+ p2.x = p1.x + width;
+ p2.y = p1.y + height;
+
+ sem_wait(&grx_mutex);
+
+ grx_text(name, p1.x, p1.y + height + 3, color, background);
+ grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
+
+ grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
+ amp = round( var * (float)((p2.x - p1.x)/2) / max );
+ if (amp >= 0)
+ grx_box((p1.x+p2.x)/2, p1.y, ((p1.x+p2.x)/2)+amp, p2.y, color);
+ else
+ grx_box((p1.x+p2.x)/2+amp, p1.y, ((p1.x+p2.x)/2), p2.y, color);
+ grx_line((p1.x+p2.x)/2, p1.y-2, (p1.x+p2.x)/2, p2.y+2, border);
+
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void cmd_display()
+{
+ point p1;
+
+ p1.x = TRACK_X1;
+ p1.y = TRACK_Y2+3;
+
+ sem_wait(&grx_mutex);
+ grx_rect(p1.x, p1.y, p1.x+CMD_WIDTH, p1.y+CMD_HEIGHT, BLUE);
+ grx_rect(p1.x+1, p1.y+1, p1.x+CMD_WIDTH-1, p1.y+CMD_HEIGHT-1, CYAN);
+ grx_rect(p1.x+2, p1.y+2, p1.x+CMD_WIDTH-2, p1.y+CMD_HEIGHT-2, LIGHTBLUE);
+ grx_text("## Another Unuseful Track simulatOr ##",
+ p1.x+8, p1.y+8, YELLOW, BLACK);
+ grx_text("## -------------------------------- ##",
+ p1.x+8, p1.y+16, YELLOW, BLACK);
+ grx_text("Marco Dallera", p1.x+8, p1.y+24, GREEN, BLACK);
+ grx_text("marchicchio@libero.it", p1.x+120, p1.y+24, GREEN, BLACK);
+ grx_text("Marco Fiocca", p1.x+8, p1.y+32, GREEN, BLACK);
+ grx_text("marqinho@tiscalinet.it", p1.x+120, p1.y+32, GREEN, BLACK);
+
+ grx_text("Command keys ", p1.x+8, p1.y+48, LIGHTBLUE, BLACK);
+ grx_text("------------------------", p1.x+8, p1.y+56, LIGHTBLUE, BLACK);
+ grx_text("h create a HARD car", p1.x+8, p1.y+64, CYAN, BLACK);
+ grx_text("s create a SOFT car", p1.x+8, p1.y+72, CYAN, BLACK);
+ grx_text("ENTER exit to DOS", p1.x+8, p1.y+80, CYAN, BLACK);
+
+ sem_post(&grx_mutex);
+
+}
+
+/* ------------------------------------------------------------------ */
+
Index: branches/pj/auto/edfact.h
===================================================================
--- branches/pj/auto/edfact.h (nonexistent)
+++ branches/pj/auto/edfact.h (revision 1085)
@@ -0,0 +1,151 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: edfact.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:42 $
+ ------------
+
+ This file contains the server EDFACT (EDF with pending activations)
+
+ Title:
+ EDFACT
+
+ Task Models Accepted:
+ HARD_TASK_MODEL - Hard Tasks (only Periodic)
+ wcet field and mit field must be != 0. They are used to set the wcet
+ and period of the tasks.
+ periodicity field can be only PERIODIC
+ drel field is ignored
+
+ Guest Models Accepted:
+ JOB_TASK_MODEL - a single guest task activation
+ Identified by an absolute deadline and a period.
+ period field is ignored
+
+ Description:
+ This module schedule his tasks following the classic EDF scheme.
+ The task guarantee is based on the factor utilization approach.
+ The tasks scheduled are only periodic.
+ All the task are put in a queue and the scheduling is based on the
+ deadline value.
+ NO GUARANTEE is performed on guest tasks. The guarantee must be performed
+ by the level that inserts guest tasks in the EDF level.
+ If a task miss a deadline a counter is incremented.
+ If a task exausts the wcet a counter is incremented
+ No ZOMBIE support!!!!!!
+
+ Exceptions raised:
+ XUNVALID_GUEST XUNVALID_TASK
+ some primitives are not implemented:
+ task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
+
+ XACTIVATION
+ If a task is actiated through task_activate or guest_activate more than
+ one time
+
+ Restrictions & special features:
+ - This level doesn't manage the main task.
+ - At init time we have to specify:
+ . guarantee check
+ (when all task are created the system will check that the task_set
+ will not use more than the available bandwidth)
+ - A function to return the used bandwidth of the level is provided.
+ - Functions to return and reset the nact, wcet and dline miss counters
+
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#ifndef __EDFACT_H__
+#define __EDFACT_H__
+
+#include <ll/ll.h>
+#include <kernel/config.h>
+#include <sys/types.h>
+#include <kernel/types.h>
+#include <modules/codes.h>
+
+
+
+
+
+
+
+
+/*+ flags... +*/
+#define EDFACT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
+#define EDFACT_ENABLE_ALL 1
+
+#define EDFACT_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
+ in EDF_register_level... +*/
+
+
+
+
+
+#define ELASTIC_HARD_PCLASS 0x0600
+
+#define EDFACT_LEVELNAME "EDFACT base"
+#define EDFACT_LEVEL_CODE 166
+#define EDFACT_LEVEL_VERSION 1
+
+
+/*+ Registration function:
+ int flags Options to be used in this level instance...
++*/
+void EDFACT_register_level(int flags);
+
+/*+ Returns the used bandwidth of a level +*/
+bandwidth_t EDFACT_usedbandwidth(LEVEL l);
+
+/*+ returns respectively the number of dline, wcet or nact; -1 if error +*/
+int EDFACT_get_dline_miss(PID p);
+int EDFACT_get_wcet_miss(PID p);
+int EDFACT_get_nact(PID p);
+
+/*+ resets respectively the number of dline, wcet miss; -1 if error +*/
+int EDFACT_reset_dline_miss(PID p);
+int EDFACT_reset_wcet_miss(PID p);
+
+#endif
+
Index: branches/pj/auto/makefile
===================================================================
--- branches/pj/auto/makefile (nonexistent)
+++ branches/pj/auto/makefile (revision 1085)
@@ -0,0 +1,23 @@
+#
+# Auto Makefile
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= auto auto2 auto3
+
+include $(BASE)/config/example.mk
+
+auto:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil1.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o"
+
+auto2:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil2.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o"
+
+auto3:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil3.o sensor.o control.o keyb.o info.o utils.o tracks.o edfact.o jetctrl.o"
+
+
Index: branches/pj/myapp2/myapp.c
===================================================================
--- branches/pj/myapp2/myapp.c (nonexistent)
+++ branches/pj/myapp2/myapp.c (revision 1085)
@@ -0,0 +1,55 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+// if you want to use some functions, types, task models provided
+// by your new module
+
+#include "mymod.h"
+
+// then, include any file you want here
+
+// then, the classic C-style function
+int main(int argc, char **argv)
+{
+ // ... your stuff here
+ return 0;
+}
+
+
+
+
+
+
+
+
Index: branches/pj/myapp2/readme.txt
===================================================================
--- branches/pj/myapp2/readme.txt (nonexistent)
+++ branches/pj/myapp2/readme.txt (revision 1085)
@@ -0,0 +1,7 @@
+This is a template application, and it DOES NOTHING!!!
+
+This is only an example package.
+
+Please refer to the How To Compile reference guide for more informations.
+
+Paolo
Index: branches/pj/myapp2/makefile
===================================================================
--- branches/pj/myapp2/makefile (nonexistent)
+++ branches/pj/myapp2/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= $(APP)
+
+include $(BASE)/config/example.mk
+
+$(APP):
+ make -f $(SUBMAKE) INIT=hartik3.o OTHEROBJS=
+
Index: branches/pj/eli/eli.h
===================================================================
--- branches/pj/eli/eli.h (nonexistent)
+++ branches/pj/eli/eli.h (revision 1085)
@@ -0,0 +1,173 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: eli.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 ALLEN-DESTRO and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+/***************************************/
+/* Corso di Informatica Industriale */
+/* Libreria con le funzioni di disegno */
+/* Creata da ALLEN-DESTRO */
+/***************************************/
+
+//########################################
+// Librerie standard del linguaggio C
+//#######################################
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+//########################################
+// Librerie Hartik
+//########################################
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <ll/i386/cons.h>
+#include <semaphore.h>
+
+//########################################
+// Definizione delle costanti del programma
+//########################################
+
+#define PER_DISEGNA 100000
+#define PER_MOLLA 100000
+#define PER_KILL 200000
+#define G 10
+#define DIM_EL 12
+#define DIM_PESO 10
+#define COL_EL YELLOW
+
+
+#define X0min 4 // Ascissa minima della finestra grafica
+#define Y0min 4 // Ordinata minima della finestra grafica
+#define X0max 796 // Ascissa massima della finestra grafica
+#define Y0max 596 // Ordinata massima della finestra grafica
+#define TERRA 400 // Ordinata della pista di atteraggio
+#define COL_SFONDO 0 // Colore di sfondo della finestra grafica
+#define COL_TESTO 7 // Colore del testo della finestra grafica
+#define COL_CORNICE RED // Colore cornici della finestra grafica
+#define DELTA_COL 32
+
+
+// Valore di pigreco
+#define PIGRECO 3.14159
+
+#define ELICOTTERO_S(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
+ grx_box(x-dim,y,x+dim,y+dim,sfo); \
+ grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
+ grx_box(x-dim,y,x+(dim*2),y+(dim/3),col); \
+ grx_line(x-dim,y+dim/2,x+2*dim,y+dim/2,col); \
+ grx_circle(x+dim*2,y,dim/2,col); \
+ grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
+
+#define ELICOTTERO_D(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
+ grx_box(x-dim,y,x+dim,y+dim,sfo); \
+ grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
+ grx_box(x-(dim*2),y,x+dim,y+(dim/3),col); \
+ grx_line(x-2*dim,y+dim/2,x+dim,y+dim/2,col); \
+ grx_circle(x-dim*2,y,dim/2,col); \
+ grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
+
+#define PESO(x,y,dim,col) grx_box(x-dim,y,x+dim,y+2*dim,col)
+
+#define MOLLA(x,y1,y2,col) { \
+ int w; \
+ for (w=y1;w<y2;w=w+2) grx_line(x-3,w,x+3,w,col); \
+ }
+
+#define RUSPA_S(x,y,col,colvet) grx_box(x,y-20,x+2,y,col); \
+ grx_line(x,y-10,x+5,y-10,col); \
+ grx_box(x+5,y-30,x+20,y-5,col); \
+ grx_box(x+5,y-10,x+40,y-5,col); \
+ grx_disc(x+10,y-5,5,col); \
+ grx_disc(x+30,y-5,5,col); \
+ grx_box(x+5,y-25,x+12,y-15,colvet)
+
+#define RUSPA_D(x,y,col,colvet) grx_box(x-2,y-20,x,y,col); \
+ grx_line(x-5,y-10,x,y-10,col); \
+ grx_box(x-20,y-30,x-5,y-5,col); \
+ grx_box(x-40,y-10,x-5,y-5,col); \
+ grx_disc(x-10,y-5,5,col); \
+ grx_disc(x-30,y-5,5,col); \
+ grx_box(x-12,y-25,x-5,y-15,colvet)
+
+#define ESPLOSIONE(x,y) grx_box(x-2,y-2,x+1,y+1,RED+1); \
+ grx_box(x-5,y-5,x-4,y-3,RED+1); \
+ grx_box(x-6,y-2,x-4,y,RED+1); \
+ grx_box(x+3,y+4,x+4,y+7,RED+1); \
+ grx_box(x+5,y-6,x+8,y-4,RED+1); \
+ grx_box(x-10,y+10,x-8,y+8,RED+1); \
+ grx_box(x-1,y-10,x+1,y-8,RED+1); \
+ grx_box(x-13,y-1,x-10,y+1,RED+1); \
+ grx_box(x+8,y-7,x+10,y-5,RED+1); \
+ grx_box(x,y+6,x-1,y+8,RED+1); \
+ grx_box(x-DIM_PESO-1,y-1,x-DIM_PESO+1,y+1,RED+1); \
+ grx_box(x-DIM_PESO-1,y+2*DIM_PESO-1,x-DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
+ grx_box(x+DIM_PESO-1,y-1,x+DIM_PESO+1,y+1,RED+1); \
+ grx_box(x+DIM_PESO-1,y+2*DIM_PESO-1,x+DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
+ grx_box(x-1,y+DIM_PESO-1,x+1,y+DIM_PESO+1,RED+1); \
+ grx_box(x+4,y+DIM_PESO-1,x+6,y+DIM_PESO+1,RED+1); \
+
+//#define PULISCI(x,y) grx_box(x-14,y-11,x+DIM_PESO+2,y+2*DIM_PESO+2,COL_SFONDO)
+#define PULISCI(x,y,d) grx_disc(x,y,d,COL_SFONDO)
+
+/*********************************************************************/
+/* */
+/* Funzione per disegnare gli elementi statici */
+/* */
+/*********************************************************************/
+extern char tastiera;
+extern long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Massa;
+// Definizione del semaforo per l'utilizzo della modalità grafica
+extern sem_t mutex;
+
+TASK disegna_stato(int i);
+
+
+
Index: branches/pj/eli/initfile.c
===================================================================
--- branches/pj/eli/initfile.c (nonexistent)
+++ branches/pj/eli/initfile.c (revision 1085)
@@ -0,0 +1,100 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ HARTPORT_init();
+
+ KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/eli/eli.c
===================================================================
--- branches/pj/eli/eli.c (nonexistent)
+++ branches/pj/eli/eli.c (revision 1085)
@@ -0,0 +1,782 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: eli.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "eli.h"
+
+
+//########################################
+// Definizione variabili globali
+//########################################
+char tastiera;
+long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Pos_x,Pos_y;
+long double Pos_pe_y[5];
+long double Pos_pe_x[5];
+long double T1=0;
+long double r;
+int n_peso=0;
+int peso_agganciato[5]={0,0,0,0,0};
+int pre_peso[5]={0,0,0,0,0};
+int libero_peso[5]={0,0,0,0,0};
+PID pid_peso[5];
+PID pid_ruspa[5];
+int x_r=200;
+int n_ruspa=5;
+int indietro;
+int eli_occ=0;
+int kill_p;
+
+//PID pid_r0,pid_r1,pid_r2,pid_r3,pid_r4;
+PID pid_kill_p,pid_pulisci_p,pid_kill_e,pid_pulisci_e;
+
+
+// Definizione del semaforo per l'utilizzo della modalita' grafica
+sem_t mutex;
+sem_t pu;
+
+
+
+
+//#######################################################################
+//############### DEFINIZIONE TASK ######################################
+//#######################################################################
+
+TASK kill_task(int i)
+{ int x,y,dim;
+ while (1)
+ {
+
+ if(i==1)
+ {
+ x=Pos_pe_x[kill_p];
+ y=Pos_pe_y[kill_p];
+ dim=25;
+ }
+ else
+ {
+ x=Pos_x;
+ y=Pos_y;
+ dim=35;
+ }
+
+ PULISCI(x,y,dim);
+ ESPLOSIONE(x,y);
+
+ sem_wait(&pu);
+
+ if(i==1) task_activate(pid_pulisci_p);
+ else task_activate(pid_pulisci_e);
+
+ task_endcycle();
+
+ }
+
+
+}
+
+TASK pulisci(int i)
+{ int x,y,dim;
+ while (1)
+ {
+
+ if(i==1)
+ {
+ x=Pos_pe_x[kill_p];
+ y=Pos_pe_y[kill_p];
+ dim=25;
+ }
+ else
+ {
+ x=Pos_x;
+ y=Pos_y;
+ dim=35;
+ }
+
+
+ task_delay(3000);
+ PULISCI(x,y,dim);
+
+ sem_post(&pu);
+
+ task_endcycle();
+ }
+}
+
+
+
+
+TASK elicottero(int i)
+{ long double x_old,x_new,y_old,y_new;
+ TIME us_old,us_new;
+ long double delta_T;
+ long double Fx,Fy,Ax,Ay,Vx,Vy,m_el;
+ int Destra_old,Destra_new;
+ // int uccidi,colore;
+ // int prova;
+
+ m_el=1;
+ Vx=0;Vy=0;
+ Ax=0;Ay=0;
+ Fx=0;Fy=0-m_el*G; // Fy=0;
+ x_old=150;
+ y_old=150;
+ Destra_old=1;
+ Destra_new=1;
+
+ us_old=sys_gettime(NULL);
+
+ while (1)
+ {
+
+ // prova=2;
+
+
+ us_new=sys_gettime(NULL);
+ delta_T=(us_new-us_old)/100000;
+ // if(delta_T<0.9) prova=1;
+ // if(delta_T<0) prova=4;
+ // if(delta_T>1.1) prova=3;
+
+
+ delta_T=1;
+ Ax=(Fx-(r*Vx))/m_el;
+ Ay=(Fy-(r*Vy)+m_el*G+T1)/m_el;
+ x_new=x_old+Vx*delta_T+0.5*Ax*delta_T*delta_T;
+ y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
+
+ // if(prova==1) {x_new=300; y_new=150;}
+ // if(prova==3) {x_new=150; y_new=300;}
+ // if(prova==2) {x_new=300; y_new=300;}
+ // if(prova==4) {x_new=400; y_new=400;}
+
+ Vx=Vx+Ax*delta_T;
+ Vy=Vy+Ay*delta_T;
+ if ((Vx>0)|| ((Vx==0) && (Destra_old==1))) Destra_new=1;
+ else Destra_new=0;
+
+ if ( ((y_new>=(Y0max-DIM_EL/2-2)) || ( (y_old<=400-DIM_EL/2-2) && (y_new>=400-DIM_EL/2-2) && (x_new>=X0min+151) && (x_new<=X0min+280) )) )
+ {
+ if ((x_new>=X0min+151) && (x_new<=X0min+280)) y_new=400-DIM_EL/2-2;
+ else y_new=Y0max-DIM_EL/2-2;
+ Vy=0;
+ Vx=0;
+ x_new=x_old;
+ Ay=0;
+ Ax=0;
+ }
+
+
+
+
+ sem_wait(&mutex);
+
+ /*
+ uccidi=0;
+
+ colore=grx_getpixel(x_new-2*DIM_EL,y_new-DIM_EL);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new+2*DIM_EL,y_new-DIM_EL);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new-2*DIM_EL,y_new+DIM_EL/2);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new+2*DIM_EL,y_new+DIM_EL/2);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ */
+
+ if ((x_old>100) && (y_old>100) && (x_old<X0max) )
+ {
+ if (Destra_old==0) {ELICOTTERO_S(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
+ else {ELICOTTERO_D(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
+ }
+
+ if ((x_new>100) && (y_new>100) && (x_new<X0max) )
+ {
+ /*
+ if ( uccidi==1)
+ {
+ // grx_box(10,10,100,100,RED);
+ // task_activate(pid_kill_e);
+ // sem_post(&mutex);
+ // eli_occ=0;
+ sem_post(&mutex);
+ task_abort();
+ }
+ */
+
+
+ if (Destra_new==0) {ELICOTTERO_S(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
+ else {ELICOTTERO_D(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
+ }
+ sem_post(&mutex);
+
+ if (tastiera=='c') Fx=Fx+0.25;
+ if (tastiera=='z') Fx=Fx-0.25;
+ if (tastiera=='x') Fy=Fy+0.25;
+ if (tastiera=='s') Fy=Fy-0.25;
+
+ if (Fx>2) Fx=2;
+ if (Fx<-2) Fx=-2;
+ if (Fy>0) Fy=0;
+ if (Fy<-17.5) Fy=-17.5;
+
+ Forza_x=Fx;
+ Forza_y=Fy;
+ Acc_x=Ax;
+ Acc_y=Ay;
+ Velocita_x=Vx;
+ Velocita_y=Vy;
+ Pos_x=x_new;
+ Pos_y=y_new;
+
+
+ if ( (tastiera=='z') || (tastiera=='x') || (tastiera=='c') || (tastiera=='s') )
+ tastiera='q';
+
+
+ us_old=us_new;
+ x_old=x_new;
+ y_old=y_new;
+ Destra_old=Destra_new;
+
+ task_endcycle();
+ }
+}
+
+
+
+TASK peso(int i)
+{
+ long double delta_T;
+ long double Ay,Vy;
+ long double x_new,x_old,y_old,y_new;
+ int scelta=0;
+ int rit,colore,uccidi;
+ double m_peso[5]={0.5,0.4,0.3,0.1,0.6};
+ int delta_y1,delta_y2;
+
+
+ // PID pid;
+ // MODEL m = BASE_MODEL;
+
+ Vy=0;
+ Ay=0;
+
+ x_old=700-DIM_PESO-1;
+ y_old=Y0max-DIM_PESO*2-1;
+ delta_T=1;
+ x_new=700-DIM_PESO-1;
+
+ libero_peso[i]=0;
+
+ while (1 )
+ {
+ uccidi=0;
+
+ if (scelta==0 )
+ {
+
+ y_new=y_old;
+ if (x_new+DIM_PESO==x_r-1) x_new=x_new-1;
+ else x_new=x_new;
+ if (indietro==1) {scelta=1; libero_peso[i]=1;}
+ }
+
+ if (scelta==1 )
+ {
+ y_new=y_old;
+ x_new=x_old;
+ if (peso_agganciato[i]==1) scelta=2;
+ }
+ if (scelta==2)
+ {
+ eli_occ=1;
+ Ay=(m_peso[i]*G-(r*Vy)-T1)/m_peso[i];
+ if(peso_agganciato[i]==1) x_new=Pos_x;
+ else x_new=x_old;
+ y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
+ Vy=Vy+Ay*delta_T;
+
+ delta_y1=Y0max-y_new;
+ delta_y2=400-y_new;
+
+ if ( (y_new>=(Y0max-2*DIM_PESO-1)) || ( (y_old<400-2*DIM_PESO-1) && (y_new>=400-2*DIM_PESO-1) && (x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO) ) )
+ {
+ if ((x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO))
+ {
+ if (delta_y2<6) uccidi=1;
+ y_new=400-2*DIM_PESO-2;
+ }
+ else {
+ if (delta_y1<6) uccidi=1;
+ y_new=Y0max-2*DIM_PESO-2;
+ }
+ Vy=0;
+ if(peso_agganciato[i]==0) {scelta=3; rit=0;}
+ }
+ }
+ if (scelta==3)
+ {
+ x_new=x_new;
+ y_new=y_new;
+ eli_occ=0;
+ if (y_new==400-2*DIM_PESO-2) rit++;
+
+
+
+ if (rit==100) {
+ peso_agganciato[i]=0;
+ pre_peso[i]=0;
+ sem_wait(&mutex);
+ PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
+ sem_post(&mutex);
+
+ return NULL;
+ }
+
+ if(peso_agganciato[i]==1) scelta=2;
+ }
+
+ sem_wait(&mutex);
+
+
+ colore=grx_getpixel(x_new-DIM_PESO,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new+DIM_PESO,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new-DIM_PESO,y_new+2*DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new+DIM_PESO,y_new+2*DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new,y_new+DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+
+
+ if ((x_old>100) && (y_old>100) && (x_old<X0max) )
+ {
+ PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
+ }
+
+ y_old=y_new;
+ x_old=x_new;
+ Pos_pe_y[i]=y_new;
+ Pos_pe_x[i]=x_new;
+
+
+ if ((x_new>100) && (y_new>100) && (x_new<X0max) )
+ {
+ if ( uccidi==1)
+ {
+ kill_p=i;
+ task_activate(pid_kill_p);
+ sem_post(&mutex);
+ eli_occ=0;
+ pre_peso[i]=0;
+ peso_agganciato[i]=0;
+ return NULL;
+ }
+
+ PESO(x_new,y_new,DIM_PESO,DELTA_COL+i*2);
+ }
+ sem_post(&mutex);
+
+
+ task_endcycle();
+ }
+
+
+}
+
+TASK ruspa(int i)
+{
+ int x,y,ii;
+ int end_peso[5]={370,420,470,520,570};
+
+ PID pid;
+ HARD_TASK_MODEL m_hard;
+
+ pre_peso[i]=1;
+
+ hard_task_default_model(m_hard);
+ hard_task_def_wcet(m_hard,1); // wcet ignored!!!
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ hard_task_def_usemath(m_hard);
+ hard_task_def_arg(m_hard,(void *)i);
+ pid=task_create("peso2",peso,&m_hard,NULL);
+ pid_peso[i]=pid;
+ task_activate(pid_peso[i]);
+
+
+ x=720;
+ y=Y0max;
+
+ indietro=0;
+ while (x!=end_peso[i]+DIM_PESO)
+ {
+ sem_wait(&mutex);
+ RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
+ RUSPA_S(x,y,YELLOW-1,LIGHTBLUE);
+ sem_post(&mutex);
+ x_r=x;
+ x--;
+ task_endcycle();
+ }
+ sem_wait(&mutex);
+ RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
+ sem_post(&mutex);
+ indietro=1;
+ while (x!=730 )
+ {
+ sem_wait(&mutex);
+ RUSPA_D(x-1+40,y,COL_SFONDO,COL_SFONDO);
+ RUSPA_D(x+40,y,YELLOW-1,LIGHTBLUE);
+ sem_post(&mutex);
+ x++;
+ task_endcycle();
+ }
+
+ ii=i+1;
+
+ while(ii>4)
+ {
+ n_ruspa=5;
+ if(pre_peso[4]==0){
+ ii=4;
+ if(pre_peso[3]==0){
+ ii=3;
+ if(pre_peso[2]==0){
+ ii=2;
+ if(pre_peso[1]==0){
+ ii=1;
+ if(pre_peso[0]==0){
+ ii=0;
+ }
+ }
+ }
+ }
+ }
+ task_endcycle();
+
+ }
+
+ hard_task_def_arg(m_hard,(void *)ii);
+ pid_ruspa[ii]=task_create("ruspa",ruspa,&m_hard,NULL);
+ task_activate(pid_ruspa[ii]);
+ n_ruspa=ii;
+
+ return NULL;
+}
+
+
+
+
+TASK molla(int i)
+{
+ double k=0.05;
+ double x,x_old,y1_old,y2_old;
+ double T1_old; //,T2_old;
+
+ x_old=Pos_x;
+ y1_old=Pos_y;
+ y2_old=Pos_pe_y[n_peso];
+
+ while (1)
+ {
+
+ sem_wait(&mutex);
+ if ((x_old>100-DIM_EL) && (y1_old>100-DIM_EL) && (x_old<X0max) )
+ {
+ MOLLA(x_old,y1_old+DIM_EL,y2_old,COL_SFONDO)
+ }
+ else if( (y2_old>100) && (x_old<X0max) && (x_old>100) )
+ {
+ MOLLA(x_old,X0min+100,y2_old,COL_SFONDO)
+ }
+
+ x_old=Pos_x;
+ y1_old=Pos_y;
+
+ if(peso_agganciato[n_peso]==0) y2_old=y1_old+20;
+ else y2_old=Pos_pe_y[n_peso];
+
+ if ((x_old>100) && (y1_old>100-DIM_EL) && (x_old<X0max) )
+ {
+ MOLLA(x_old,y1_old+DIM_EL,y2_old,RED)
+ }
+ else if( (y2_old>100) && (x_old<X0max) && (x_old>100))
+ {
+ MOLLA(x_old,X0min+100,y2_old,RED)
+ }
+ sem_post(&mutex);
+
+ x=y2_old-y1_old;
+ x=x-20;
+ T1=x*k;
+ T1_old=T1;
+
+ task_endcycle();
+
+ }
+}
+
+TASK seleziona(int i)
+{ int w,deltax,deltay,disegna;
+
+ eli_occ=0;
+ disegna=0;
+
+ while (1)
+ {
+ disegna=0;
+ for (w=0;w<5;w++)
+ {
+ deltax=Pos_pe_x[w]-Pos_x;
+ deltay=Pos_pe_y[w]-Pos_y-DIM_PESO-20+DIM_EL;
+ if ( (pre_peso[w]==1) && (eli_occ==0) && (deltax<4) && (deltax>-4) && (deltay<3) && (deltay>-3) )
+ {
+ disegna=1;
+ if ( (tastiera=='p') && (libero_peso[w]==1) )
+ {
+ eli_occ=1;
+ peso_agganciato[w]=1;
+ n_peso=w;
+
+ }
+ }
+ }
+
+ if(disegna==1)
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90,Y0min+5,X0max-5,Y0min+95,RED);
+ // grx_text("Ok", X0max-40, Y0min+50, COL_TESTO, RED);
+ sem_post(&mutex);
+ } else
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-95,Y0min+5,X0max-5,Y0min+95,COL_SFONDO);
+ sem_post(&mutex);
+ }
+
+ if(eli_occ==1)
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,GREEN);
+ // grx_text("Go", X0max-35-100, Y0min+50, COL_TESTO, GREEN);
+ sem_post(&mutex);
+ } else
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,COL_SFONDO);
+ sem_post(&mutex);
+ }
+
+
+ if (tastiera=='l') peso_agganciato[n_peso]=0;
+
+ task_endcycle();
+
+ }
+}
+
+
+//###############################################################
+// ##
+// Funzione di uscita dal programma ##
+// ##
+//################################################################
+void my_end(KEY_EVT* e)
+{
+ //####################################
+ // Sezione esecutiva della funzione ##
+ //####################################
+
+ grx_close();
+ cprintf("Ctrl-brk pressed!\n");
+ sys_end();
+} // Fine della funzionemy_end
+
+//################################################################
+// ##
+// Funzione di uscita dal programma ##
+// ##
+//################################################################
+void end()
+{
+ //####################################
+ // Sezione esecutiva della funzione ##
+ //####################################
+
+ grx_close();
+} // Fine della funzione my_end
+
+
+
+//##############################################################
+// ##
+// Main ##
+// ##
+//##############################################################
+int main()
+{
+ //########################################
+ // Sezione dichiarativa delle variabili ##
+ //########################################
+ // Identficativi di task generici
+ PID pid0, pid1, pid3, pid5; //, pid2,pid4,pid6;
+
+ HARD_TASK_MODEL m_hard;
+ NRT_TASK_MODEL m_nrt;
+
+ // Ascoltatore di eventi
+ KEY_EVT emerg;
+ // Contatori
+ int j;
+
+
+ //####################################
+ // Sezione esecutiva del main ##
+ //####################################
+
+ set_exchandler_grx();
+
+ // Inizializzazione dei parametri hartik
+ sem_init(&mutex,0,1);
+ sem_init(&pu,0,1);
+
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg, my_end);
+ sys_atrunlevel(end, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ if (grx_open(800, 600, 8) < 0)
+ {
+ cprintf("GRX Err\n");
+ sys_abort(300);
+ }
+ cprintf("scheda ok\n");
+
+ r=0.1;
+
+ /* Disposizione degli elementi grafici statici */
+ sem_wait(&mutex);
+ draw_static();
+ sem_post(&mutex);
+
+ // Attivazione dei task
+ hard_task_default_model(m_hard);
+ hard_task_def_wcet(m_hard,1); // wcet ignored!!!
+ hard_task_def_usemath(m_hard);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid0=task_create("elicottero",elicottero,&m_hard,NULL);
+ task_activate(pid0);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid1=task_create("indicometro",disegna_stato,&m_hard,NULL);
+ task_activate(pid1);
+
+ hard_task_def_mit(m_hard,PER_MOLLA);
+ pid3=task_create("molla",molla,&m_hard,NULL);
+ task_activate(pid3);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid5=task_create("seleziona",seleziona,&m_hard,NULL);
+ task_activate(pid5);
+
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ hard_task_def_arg(m_hard,0);
+ pid_ruspa[0]=task_create("ruspa",ruspa,&m_hard,NULL);
+ task_activate(pid_ruspa[0]);
+ n_ruspa=0;
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_usemath(m_nrt);
+ nrt_task_def_arg(m_nrt,0);
+ pid_kill_e = task_create("kill_task",kill_task, &m_nrt, NULL);
+ pid_pulisci_e = task_create("pulisci",pulisci, &m_nrt, NULL);
+
+ nrt_task_def_arg(m_nrt,(void *)1);
+ pid_kill_p = task_create("kill_task",kill_task, &m_nrt, NULL);
+ pid_pulisci_p = task_create("pulisci",pulisci, &m_nrt, NULL);
+
+
+
+
+ do {
+ tastiera = keyb_getch(BLOCK);
+
+ } while(tastiera!=ESC);
+
+ task_kill(pid5);
+ task_kill(pid3);
+ task_kill(pid1);
+ task_kill(pid0);
+
+ task_kill(pid_kill_p);
+ task_kill(pid_kill_e);
+
+ if (n_ruspa!=5) task_kill(pid_ruspa[n_ruspa]);
+ for(j=0;j<5;j++) { if (pre_peso[j]==1) task_kill(pid_peso[j]); }
+
+ grx_close();
+ sys_end();
+
+ return 0;
+} // Fine del main
+
+/***************************<Fine del file>*******************************/
Index: branches/pj/eli/makefile
===================================================================
--- branches/pj/eli/makefile (nonexistent)
+++ branches/pj/eli/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= eli
+
+include $(BASE)/config/example.mk
+
+eli:
+ make -f $(SUBMAKE) APP=eli INIT= OTHEROBJS="initfile.o draw.o" OTHERINCL=
+
Index: branches/pj/eli/draw.c
===================================================================
--- branches/pj/eli/draw.c (nonexistent)
+++ branches/pj/eli/draw.c (revision 1085)
@@ -0,0 +1,519 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: draw.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "eli.h"
+
+void draw_static()
+{
+ int i;
+ /************************************/
+ /* Sezione esecutiva della funzione */
+ /************************************/
+
+ grx_rect(X0min,Y0min,X0max,Y0max,COL_CORNICE);
+ // grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
+ grx_line(X0min,Y0min+100,X0min+100,Y0min+100,COL_CORNICE);
+ // grx_line(X0min,Y0min+350,X0min+100,Y0min+350,COL_CORNICE);
+
+ grx_line(X0min+25,Y0min+100,X0min+25,Y0max,COL_CORNICE);
+ grx_line(X0min+50,Y0min+100,X0min+50,Y0max,COL_CORNICE);
+ grx_line(X0min+75,Y0min+100,X0min+75,Y0max,COL_CORNICE);
+
+ grx_line(X0min,Y0min+100+127,X0min+25,Y0min+100+127,LIGHTBLUE);
+ grx_line(X0min+50,Y0min+100+127,X0min+100,Y0min+100+127,LIGHTBLUE);
+ grx_line(X0min+50,Y0min+100+127+250,X0min+100,Y0min+100+127+250,LIGHTBLUE);
+
+
+ grx_box(X0min+101+50,400,X0min+230+50,Y0max-1,BROWN);
+ for(i=1;i<6;i++){
+ grx_box(X0min+101+50+38,400+35*i-10,X0min+101+50+48,400+35*i,CYAN);
+ grx_box(X0min+101+50+81,400+35*i-10,X0min+101+50+91,400+35*i,CYAN);
+ }
+ grx_box(X0min+101+50+60,Y0max-30,X0min+101+50+70,Y0max-1,GREEN);
+
+
+ grx_box(700,520,X0max-1,Y0max-1,CYAN);
+
+
+
+ grx_text("Fx", X0min+5, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Fy", X0min+30, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Ax", X0min+55, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Ay", X0min+80, Y0min+90, COL_TESTO, COL_SFONDO);
+ // grx_text("M", X0min+10, Y0min+351, COL_TESTO, COL_SFONDO);
+ // grx_text("P", X0min+35, Y0min+351, COL_TESTO, COL_SFONDO);
+ grx_text("Vx", X0min+55, Y0min+351, COL_TESTO, COL_SFONDO);
+ grx_text("Vy", X0min+80, Y0min+351, COL_TESTO, COL_SFONDO);
+
+ grx_text("S : Su", X0min+110, Y0min+15, COL_TESTO, COL_SFONDO);
+ grx_text("Z : Sinistra", X0min+110, Y0min+25, COL_TESTO, COL_SFONDO);
+ grx_text("X : Giu", X0min+110, Y0min+35, COL_TESTO, COL_SFONDO);
+ grx_text("C : Destra", X0min+110, Y0min+45, COL_TESTO, COL_SFONDO);
+ grx_text("P : aggancia Peso", X0min+110, Y0min+55, COL_TESTO, COL_SFONDO);
+ grx_text("L : Libera peso", X0min+110, Y0min+65, COL_TESTO, COL_SFONDO);
+ grx_text("Esc : Usita Programma", X0min+110, Y0min+75, COL_TESTO, COL_SFONDO);
+
+
+} // Fine della funzione draw_static
+
+TASK disegna_stato(int i)
+{ //double j;
+
+ while (1)
+ {
+
+ sem_wait(&mutex);
+
+ grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
+
+ grx_box(700,565,770,Y0max-1,LIGHTCYAN);
+
+ grx_box(X0min+101+50,400,X0min+230+50,420,BROWN);
+
+
+ //####################### FORZA X #############################
+ if ( 0.25<=Forza_x) grx_box(7,Y0min+210,26,Y0min+220,GREEN);
+ else grx_box(7,Y0min+210,26,Y0min+220,COL_SFONDO);
+ if ( 0.5<=Forza_x) grx_box(7,Y0min+195,26,Y0min+205,GREEN);
+ else grx_box(7,Y0min+195,26,Y0min+205,COL_SFONDO);
+ if ( 0.75<=Forza_x) grx_box(7,Y0min+180,26,Y0min+190,GREEN);
+ else grx_box(7,Y0min+180,26,Y0min+190,COL_SFONDO);
+ if ( 1<=Forza_x) grx_box(7,Y0min+165,26,Y0min+175,GREEN);
+ else grx_box(7,Y0min+165,26,Y0min+175,COL_SFONDO);
+ if ( 1.25<=Forza_x) grx_box(7,Y0min+150,26,Y0min+160,GREEN);
+ else grx_box(7,Y0min+150,26,Y0min+160,COL_SFONDO);
+ if ( 1.50<=Forza_x) grx_box(7,Y0min+135,26,Y0min+145,YELLOW);
+ else grx_box(7,Y0min+135,26,Y0min+145,COL_SFONDO);
+ if ( 1.75<=Forza_x) grx_box(7,Y0min+120,26,Y0min+130,RED);
+ else grx_box(7,Y0min+120,26,Y0min+130,COL_SFONDO);
+ if ( 2<=Forza_x) grx_box(7,Y0min+105,26,Y0min+115,RED);
+ else grx_box(7,Y0min+105,26,Y0min+115,COL_SFONDO);
+ //########### ------
+ if (-0.25>=Forza_x) grx_box(7,Y0min+230,26,Y0min+240,GREEN);
+ else grx_box(7,Y0min+230,26,Y0min+240,COL_SFONDO);
+ if ( -0.5>=Forza_x) grx_box(7,Y0min+245,26,Y0min+255,GREEN);
+ else grx_box(7,Y0min+245,26,Y0min+255,COL_SFONDO);
+ if ( -0.75>=Forza_x) grx_box(7,Y0min+260,26,Y0min+270,GREEN);
+ else grx_box(7,Y0min+260,26,Y0min+270,COL_SFONDO);
+ if ( -1>=Forza_x) grx_box(7,Y0min+275,26,Y0min+285,GREEN);
+ else grx_box(7,Y0min+275,26,Y0min+285,COL_SFONDO);
+ if ( -1.25>=Forza_x) grx_box(7,Y0min+290,26,Y0min+300,GREEN);
+ else grx_box(7,Y0min+290,26,Y0min+300,COL_SFONDO);
+ if ( -1.50>=Forza_x) grx_box(7,Y0min+305,26,Y0min+315,YELLOW);
+ else grx_box(7,Y0min+305,26,Y0min+315,COL_SFONDO);
+ if ( -1.75>=Forza_x) grx_box(7,Y0min+320,26,Y0min+330,RED);
+ else grx_box(7,Y0min+320,26,Y0min+330,COL_SFONDO);
+ if ( -2>=Forza_x) grx_box(7,Y0min+335,26,Y0min+345,RED);
+ else grx_box(7,Y0min+335,26,Y0min+345,COL_SFONDO);
+ //####################### FORZA Y #############################
+ if ( -0.5>=Forza_y) grx_box(32,Y0min+340,51,Y0min+345,GREEN);
+ else grx_box(32,Y0min+340,51,Y0min+345,COL_SFONDO);
+ if ( -1>=Forza_y) grx_box(32,Y0min+333,51,Y0min+338,GREEN);
+ else grx_box(32,Y0min+333,51,Y0min+338,COL_SFONDO);
+ if ( -1.5>=Forza_y) grx_box(32,Y0min+326,51,Y0min+331,GREEN);
+ else grx_box(32,Y0min+326,51,Y0min+331,COL_SFONDO);
+ if ( -2>=Forza_y) grx_box(32,Y0min+319,51,Y0min+324,GREEN);
+ else grx_box(32,Y0min+319,51,Y0min+324,COL_SFONDO);
+ if ( -2.5>=Forza_y) grx_box(32,Y0min+312,51,Y0min+317,GREEN);
+ else grx_box(32,Y0min+312,51,Y0min+317,COL_SFONDO);
+ if ( -3>=Forza_y) grx_box(32,Y0min+305,51,Y0min+310,GREEN);
+ else grx_box(32,Y0min+305,51,Y0min+310,COL_SFONDO);
+ if ( -3.5>=Forza_y) grx_box(32,Y0min+298,51,Y0min+303,GREEN);
+ else grx_box(32,Y0min+298,51,Y0min+303,COL_SFONDO);
+ if ( -4>=Forza_y) grx_box(32,Y0min+291,51,Y0min+296,GREEN);
+ else grx_box(32,Y0min+291,51,Y0min+296,COL_SFONDO);
+ if ( -4.5>=Forza_y) grx_box(32,Y0min+284,51,Y0min+289,GREEN);
+ else grx_box(32,Y0min+284,51,Y0min+289,COL_SFONDO);
+ if ( -5>=Forza_y) grx_box(32,Y0min+277,51,Y0min+282,GREEN);
+ else grx_box(32,Y0min+277,51,Y0min+282,COL_SFONDO);
+ if ( -5.5>=Forza_y) grx_box(32,Y0min+270,51,Y0min+275,GREEN);
+ else grx_box(32,Y0min+270,51,Y0min+275,COL_SFONDO);
+ if ( -6>=Forza_y) grx_box(32,Y0min+263,51,Y0min+268,GREEN);
+ else grx_box(32,Y0min+263,51,Y0min+268,COL_SFONDO);
+ if ( -6.5>=Forza_y) grx_box(32,Y0min+256,51,Y0min+261,GREEN);
+ else grx_box(32,Y0min+256,51,Y0min+261,COL_SFONDO);
+ if ( -7>=Forza_y) grx_box(32,Y0min+249,51,Y0min+254,GREEN);
+ else grx_box(32,Y0min+249,51,Y0min+254,COL_SFONDO);
+ if ( -7.5>=Forza_y) grx_box(32,Y0min+242,51,Y0min+247,GREEN);
+ else grx_box(32,Y0min+242,51,Y0min+247,COL_SFONDO);
+ if ( -8>=Forza_y) grx_box(32,Y0min+235,51,Y0min+240,GREEN);
+ else grx_box(32,Y0min+235,51,Y0min+240,COL_SFONDO);
+ if ( -8.5>=Forza_y) grx_box(32,Y0min+228,51,Y0min+233,GREEN);
+ else grx_box(32,Y0min+228,51,Y0min+233,COL_SFONDO);
+ if ( -9>=Forza_y) grx_box(32,Y0min+221,51,Y0min+226,GREEN);
+ else grx_box(32,Y0min+221,51,Y0min+226,COL_SFONDO);
+ if ( -9.5>=Forza_y) grx_box(32,Y0min+214,51,Y0min+219,GREEN);
+ else grx_box(32,Y0min+214,51,Y0min+219,COL_SFONDO);
+ if ( -10>=Forza_y) grx_box(32,Y0min+207,51,Y0min+212,GREEN);
+ else grx_box(32,Y0min+207,51,Y0min+212,COL_SFONDO);
+ if ( -10.5>=Forza_y) grx_box(32,Y0min+200,51,Y0min+205,GREEN);
+ else grx_box(32,Y0min+200,51,Y0min+205,COL_SFONDO);
+ if ( -11>=Forza_y) grx_box(32,Y0min+193,51,Y0min+198,GREEN);
+ else grx_box(32,Y0min+193,51,Y0min+198,COL_SFONDO);
+ if ( -11.5>=Forza_y) grx_box(32,Y0min+186,51,Y0min+191,GREEN);
+ else grx_box(32,Y0min+186,51,Y0min+191,COL_SFONDO);
+ if ( -12>=Forza_y) grx_box(32,Y0min+179,51,Y0min+184,GREEN);
+ else grx_box(32,Y0min+179,51,Y0min+184,COL_SFONDO);
+ if ( -12.5>=Forza_y) grx_box(32,Y0min+172,51,Y0min+177,GREEN);
+ else grx_box(32,Y0min+172,51,Y0min+177,COL_SFONDO);
+ if ( -13>=Forza_y) grx_box(32,Y0min+165,51,Y0min+170,GREEN);
+ else grx_box(32,Y0min+165,51,Y0min+170,COL_SFONDO);
+ if ( -13.5>=Forza_y) grx_box(32,Y0min+158,51,Y0min+163,GREEN);
+ else grx_box(32,Y0min+158,51,Y0min+163,COL_SFONDO);
+ if ( -14>=Forza_y) grx_box(32,Y0min+151,51,Y0min+156,GREEN);
+ else grx_box(32,Y0min+151,51,Y0min+156,COL_SFONDO);
+ if ( -14.5>=Forza_y) grx_box(32,Y0min+144,51,Y0min+149,GREEN);
+ else grx_box(32,Y0min+144,51,Y0min+149,COL_SFONDO);
+ if ( -15>=Forza_y) grx_box(32,Y0min+137,51,Y0min+142,YELLOW);
+ else grx_box(32,Y0min+137,51,Y0min+142,COL_SFONDO);
+ if ( -15.5>=Forza_y) grx_box(32,Y0min+130,51,Y0min+135,YELLOW);
+ else grx_box(32,Y0min+130,51,Y0min+135,COL_SFONDO);
+ if ( -16>=Forza_y) grx_box(32,Y0min+123,51,Y0min+128,RED);
+ else grx_box(32,Y0min+123,51,Y0min+128,COL_SFONDO);
+ if ( -16.5>=Forza_y) grx_box(32,Y0min+116,51,Y0min+121,RED);
+ else grx_box(32,Y0min+116,51,Y0min+121,COL_SFONDO);
+ if ( -17>=Forza_y) grx_box(32,Y0min+109,51,Y0min+114,RED);
+ else grx_box(32,Y0min+109,51,Y0min+114,COL_SFONDO);
+ if ( -17.5>=Forza_y) grx_box(32,Y0min+102,51,Y0min+107,RED);
+ else grx_box(32,Y0min+102,51,Y0min+107,COL_SFONDO);
+
+ //####################### ACCELERAZIONE X #############################
+ if ( -2.125>=Acc_x)grx_box(56,Y0min+340,75,Y0min+345,RED);
+ else grx_box(55,Y0min+340,75,Y0min+345,COL_SFONDO);
+ if ( -2>=Acc_x) grx_box(56,Y0min+333,75,Y0min+338,RED);
+ else grx_box(56,Y0min+333,75,Y0min+338,COL_SFONDO);
+ if ( -1.875>=Acc_x)grx_box(56,Y0min+326,75,Y0min+331,RED);
+ else grx_box(56,Y0min+326,75,Y0min+331,COL_SFONDO);
+ if ( -1.750>=Acc_x) grx_box(56,Y0min+319,75,Y0min+324,YELLOW);
+ else grx_box(56,Y0min+319,75,Y0min+324,COL_SFONDO);
+ if ( -1.625>=Acc_x)grx_box(56,Y0min+312,75,Y0min+317,YELLOW);
+ else grx_box(56,Y0min+312,75,Y0min+317,COL_SFONDO);
+ if ( -1.5>=Acc_x) grx_box(56,Y0min+305,75,Y0min+310,GREEN);
+ else grx_box(56,Y0min+305,75,Y0min+310,COL_SFONDO);
+ if ( -1.375>=Acc_x)grx_box(56,Y0min+298,75,Y0min+303,GREEN);
+ else grx_box(56,Y0min+298,75,Y0min+303,COL_SFONDO);
+ if ( -1.250>=Acc_x) grx_box(56,Y0min+291,75,Y0min+296,GREEN);
+ else grx_box(56,Y0min+291,75,Y0min+296,COL_SFONDO);
+ if ( -1.125>=Acc_x)grx_box(56,Y0min+284,75,Y0min+289,GREEN);
+ else grx_box(56,Y0min+284,75,Y0min+289,COL_SFONDO);
+ if ( -1>=Acc_x) grx_box(56,Y0min+277,75,Y0min+282,GREEN);
+ else grx_box(56,Y0min+277,75,Y0min+282,COL_SFONDO);
+ if ( -0.875>=Acc_x)grx_box(56,Y0min+270,75,Y0min+275,GREEN);
+ else grx_box(56,Y0min+270,75,Y0min+275,COL_SFONDO);
+ if ( -0.750>=Acc_x) grx_box(56,Y0min+263,75,Y0min+268,GREEN);
+ else grx_box(56,Y0min+263,75,Y0min+268,COL_SFONDO);
+ if ( -0.625>=Acc_x)grx_box(56,Y0min+256,75,Y0min+261,GREEN);
+ else grx_box(56,Y0min+256,75,Y0min+261,COL_SFONDO);
+ if ( -0.5>=Acc_x) grx_box(56,Y0min+249,75,Y0min+254,GREEN);
+ else grx_box(56,Y0min+249,75,Y0min+254,COL_SFONDO);
+ if ( -0.375>=Acc_x)grx_box(56,Y0min+242,75,Y0min+247,GREEN);
+ else grx_box(56,Y0min+242,75,Y0min+247,COL_SFONDO);
+ if ( -0.250>=Acc_x) grx_box(56,Y0min+235,75,Y0min+240,GREEN);
+ else grx_box(56,Y0min+235,75,Y0min+240,COL_SFONDO);
+ if ( -0.125>=Acc_x)grx_box(56,Y0min+228,75,Y0min+233,GREEN);
+ else grx_box(56,Y0min+228,75,Y0min+233,COL_SFONDO);
+ //############# ------
+ if ( 0.125<=Acc_x) grx_box(56,Y0min+221,75,Y0min+226,GREEN);
+ else grx_box(56,Y0min+221,75,Y0min+226,COL_SFONDO);
+ if ( 0.250<=Acc_x)grx_box(56,Y0min+214,75,Y0min+219,GREEN);
+ else grx_box(56,Y0min+214,75,Y0min+219,COL_SFONDO);
+ if ( 0.375<=Acc_x) grx_box(56,Y0min+207,75,Y0min+212,GREEN);
+ else grx_box(56,Y0min+207,75,Y0min+212,COL_SFONDO);
+ if (0.5<=Acc_x)grx_box(56,Y0min+200,75,Y0min+205,GREEN);
+ else grx_box(56,Y0min+200,75,Y0min+205,COL_SFONDO);
+ if ( 0.625<=Acc_x) grx_box(56,Y0min+193,75,Y0min+198,GREEN);
+ else grx_box(56,Y0min+193,75,Y0min+198,COL_SFONDO);
+ if (0.750<=Acc_x)grx_box(56,Y0min+186,75,Y0min+191,GREEN);
+ else grx_box(56,Y0min+186,75,Y0min+191,COL_SFONDO);
+ if (0.875<=Acc_x) grx_box(56,Y0min+179,75,Y0min+184,GREEN);
+ else grx_box(56,Y0min+179,75,Y0min+184,COL_SFONDO);
+ if (1<=Acc_x)grx_box(56,Y0min+172,75,Y0min+177,GREEN);
+ else grx_box(56,Y0min+172,75,Y0min+177,COL_SFONDO);
+ if (1.125<=Acc_x) grx_box(56,Y0min+165,75,Y0min+170,GREEN);
+ else grx_box(56,Y0min+165,75,Y0min+170,COL_SFONDO);
+ if (1.250<=Acc_x)grx_box(56,Y0min+158,75,Y0min+163,GREEN);
+ else grx_box(56,Y0min+158,75,Y0min+163,COL_SFONDO);
+ if (1.375<=Acc_x) grx_box(56,Y0min+151,75,Y0min+156,GREEN);
+ else grx_box(56,Y0min+151,75,Y0min+156,COL_SFONDO);
+ if (1.5<=Acc_x)grx_box(56,Y0min+144,75,Y0min+149,GREEN);
+ else grx_box(56,Y0min+144,75,Y0min+149,COL_SFONDO);
+ if (1.625<=Acc_x) grx_box(56,Y0min+137,75,Y0min+142,YELLOW);
+ else grx_box(56,Y0min+137,75,Y0min+142,COL_SFONDO);
+ if (1.750<=Acc_x)grx_box(56,Y0min+130,75,Y0min+135,YELLOW);
+ else grx_box(56,Y0min+130,75,Y0min+135,COL_SFONDO);
+ if (1.875<=Acc_x) grx_box(56,Y0min+123,75,Y0min+128,RED);
+ else grx_box(56,Y0min+123,75,Y0min+128,COL_SFONDO);
+ if (2<=Acc_x)grx_box(56,Y0min+116,75,Y0min+121,RED);
+ else grx_box(56,Y0min+116,75,Y0min+121,COL_SFONDO);
+ if (2.125<=Acc_x) grx_box(56,Y0min+109,75,Y0min+114,RED);
+ else grx_box(56,Y0min+109,75,Y0min+114,COL_SFONDO);
+ //####################### ACCELERAZIONE Y #############################
+ if ( 2.5<=Acc_y) { grx_box(81,Y0min+340,100,Y0min+345,RED);
+ grx_box(81+5,Y0min+340+1,100-5,Y0min+345-1,BLUE);
+ }
+ else grx_box(81,Y0min+340,100,Y0min+345,COL_SFONDO);
+ if ( 2.200<=Acc_y) grx_box(81,Y0min+333,100,Y0min+338,RED);
+ else grx_box(81,Y0min+333,100,Y0min+338,COL_SFONDO);
+ if ( 1.950<=Acc_y) grx_box(81,Y0min+326,100,Y0min+331,RED);
+ else grx_box(81,Y0min+326,100,Y0min+331,COL_SFONDO);
+ if ( 1.750<=Acc_y) grx_box(81,Y0min+319,100,Y0min+324,YELLOW);
+ else grx_box(81,Y0min+319,100,Y0min+324,COL_SFONDO);
+ if ( 1.625<=Acc_y) grx_box(81,Y0min+312,100,Y0min+317,YELLOW);
+ else grx_box(81,Y0min+312,100,Y0min+317,COL_SFONDO);
+ if ( 1.5<=Acc_y) grx_box(81,Y0min+305,100,Y0min+310,GREEN);
+ else grx_box(81,Y0min+305,100,Y0min+310,COL_SFONDO);
+ if ( 1.375<=Acc_y) grx_box(81,Y0min+298,100,Y0min+303,GREEN);
+ else grx_box(81,Y0min+298,100,Y0min+303,COL_SFONDO);
+ if ( 1.250<=Acc_y) grx_box(81,Y0min+291,100,Y0min+296,GREEN);
+ else grx_box(81,Y0min+291,100,Y0min+296,COL_SFONDO);
+ if ( 1.125<=Acc_y) grx_box(81,Y0min+284,100,Y0min+289,GREEN);
+ else grx_box(81,Y0min+284,100,Y0min+289,COL_SFONDO);
+ if ( 1<=Acc_y) grx_box(81,Y0min+277,100,Y0min+282,GREEN);
+ else grx_box(81,Y0min+277,100,Y0min+282,COL_SFONDO);
+ if ( 0.875<=Acc_y) grx_box(81,Y0min+270,100,Y0min+275,GREEN);
+ else grx_box(81,Y0min+270,100,Y0min+275,COL_SFONDO);
+ if ( 0.750<=Acc_y) grx_box(81,Y0min+263,100,Y0min+268,GREEN);
+ else grx_box(81,Y0min+263,100,Y0min+268,COL_SFONDO);
+ if ( 0.625<=Acc_y) grx_box(81,Y0min+256,100,Y0min+261,GREEN);
+ else grx_box(81,Y0min+256,100,Y0min+261,COL_SFONDO);
+ if ( 0.5<=Acc_y) grx_box(81,Y0min+249,100,Y0min+254,GREEN);
+ else grx_box(81,Y0min+249,100,Y0min+254,COL_SFONDO);
+ if ( 0.375<=Acc_y) grx_box(81,Y0min+242,100,Y0min+247,GREEN);
+ else grx_box(81,Y0min+242,100,Y0min+247,COL_SFONDO);
+ if ( 0.25<=Acc_y) grx_box(81,Y0min+235,100,Y0min+240,GREEN);
+ else grx_box(81,Y0min+235,100,Y0min+240,COL_SFONDO);
+ if ( 0.125<=Acc_y) grx_box(81,Y0min+228,100,Y0min+233,GREEN);
+ else grx_box(81,Y0min+228,100,Y0min+233,COL_SFONDO);
+ //############# ------
+ if ( -0.125>=Acc_y) grx_box(81,Y0min+221,100,Y0min+226,GREEN);
+ else grx_box(81,Y0min+221,100,Y0min+226,COL_SFONDO);
+ if ( -0.250>=Acc_y) grx_box(81,Y0min+214,100,Y0min+219,GREEN);
+ else grx_box(81,Y0min+214,100,Y0min+219,COL_SFONDO);
+ if ( -0.375>=Acc_y) grx_box(81,Y0min+207,100,Y0min+212,GREEN);
+ else grx_box(81,Y0min+207,100,Y0min+212,COL_SFONDO);
+ if (-0.5>=Acc_y) grx_box(81,Y0min+200,100,Y0min+205,GREEN);
+ else grx_box(81,Y0min+200,100,Y0min+205,COL_SFONDO);
+ if ( -0.625>=Acc_y) grx_box(81,Y0min+193,100,Y0min+198,GREEN);
+ else grx_box(81,Y0min+193,100,Y0min+198,COL_SFONDO);
+ if (-0.750>=Acc_y) grx_box(81,Y0min+186,100,Y0min+191,GREEN);
+ else grx_box(81,Y0min+186,100,Y0min+191,COL_SFONDO);
+ if (-0.875>=Acc_y) grx_box(81,Y0min+179,100,Y0min+184,GREEN);
+ else grx_box(81,Y0min+179,100,Y0min+184,COL_SFONDO);
+ if (-1>=Acc_y) grx_box(81,Y0min+172,100,Y0min+177,GREEN);
+ else grx_box(81,Y0min+172,100,Y0min+177,COL_SFONDO);
+ if (-1.125>=Acc_y) grx_box(81,Y0min+165,100,Y0min+170,YELLOW);
+ else grx_box(81,Y0min+165,100,Y0min+170,COL_SFONDO);
+ if (-1.250>=Acc_y) grx_box(81,Y0min+158,100,Y0min+163,YELLOW);
+ else grx_box(81,Y0min+158,100,Y0min+163,COL_SFONDO);
+ if (-1.375>=Acc_y) grx_box(81,Y0min+151,100,Y0min+156,YELLOW);
+ else grx_box(81,Y0min+151,100,Y0min+156,COL_SFONDO);
+ if (-1.5>=Acc_y) grx_box(81,Y0min+144,100,Y0min+149,YELLOW);
+ else grx_box(81,Y0min+144,100,Y0min+149,COL_SFONDO);
+ if (-1.625>=Acc_y) grx_box(81,Y0min+137,100,Y0min+142,RED);
+ else grx_box(81,Y0min+137,100,Y0min+142,COL_SFONDO);
+ if (-1.750>=Acc_y) grx_box(81,Y0min+130,100,Y0min+135,RED);
+ else grx_box(81,Y0min+130,100,Y0min+135,COL_SFONDO);
+ if (-1.875>=Acc_y) grx_box(81,Y0min+123,100,Y0min+128,RED);
+ else grx_box(81,Y0min+123,100,Y0min+128,COL_SFONDO);
+ if (-2>=Acc_y) grx_box(81,Y0min+116,100,Y0min+121,RED);
+ else grx_box(81,Y0min+116,100,Y0min+121,COL_SFONDO);
+ if (-2.3>=Acc_y) grx_box(81,Y0min+109,100,Y0min+114,RED);
+ else grx_box(81,Y0min+109,100,Y0min+114,COL_SFONDO);
+ //####################### VELOCITA X #############################
+ //if ( -21.25>=Velocita_x)grx_box(56,Y0min+340+250,75,Y0min+345+250,RED);
+ //else grx_box(55,Y0min+340+250,75,Y0min+345+250,COL_SFONDO);
+ if ( -20>=Velocita_x) grx_box(56,Y0min+333+250,75,Y0min+338+250,RED);
+ else grx_box(56,Y0min+333+250,75,Y0min+338+250,COL_SFONDO);
+ if ( -18.75>=Velocita_x)grx_box(56,Y0min+326+250,75,Y0min+331+250,RED);
+ else grx_box(56,Y0min+326+250,75,Y0min+331+250,COL_SFONDO);
+ if ( -17.50>=Velocita_x)grx_box(56,Y0min+319+250,75,Y0min+324+250,YELLOW);
+ else grx_box(56,Y0min+319+250,75,Y0min+324+250,COL_SFONDO);
+ if ( -16.25>=Velocita_x)grx_box(56,Y0min+312+250,75,Y0min+317+250,YELLOW);
+ else grx_box(56,Y0min+312+250,75,Y0min+317+250,COL_SFONDO);
+ if ( -15>=Velocita_x) grx_box(56,Y0min+305+250,75,Y0min+310+250,GREEN);
+ else grx_box(56,Y0min+305+250,75,Y0min+310+250,COL_SFONDO);
+ if ( -13.75>=Velocita_x)grx_box(56,Y0min+298+250,75,Y0min+303+250,GREEN);
+ else grx_box(56,Y0min+298+250,75,Y0min+303+250,COL_SFONDO);
+ if ( -12.50>=Velocita_x)grx_box(56,Y0min+291+250,75,Y0min+296+250,GREEN);
+ else grx_box(56,Y0min+291+250,75,Y0min+296+250,COL_SFONDO);
+ if ( -11.25>=Velocita_x)grx_box(56,Y0min+284+250,75,Y0min+289+250,GREEN);
+ else grx_box(56,Y0min+284+250,75,Y0min+289+250,COL_SFONDO);
+ if ( -10>=Velocita_x) grx_box(56,Y0min+277+250,75,Y0min+282+250,GREEN);
+ else grx_box(56,Y0min+277+250,75,Y0min+282+250,COL_SFONDO);
+ if ( -8.75>=Velocita_x)grx_box(56,Y0min+270+250,75,Y0min+275+250,GREEN);
+ else grx_box(56,Y0min+270+250,75,Y0min+275+250,COL_SFONDO);
+ if ( -7.50>=Velocita_x)grx_box(56,Y0min+263+250,75,Y0min+268+250,GREEN);
+ else grx_box(56,Y0min+263+250,75,Y0min+268+250,COL_SFONDO);
+ if ( -6.25>=Velocita_x)grx_box(56,Y0min+256+250,75,Y0min+261+250,GREEN);
+ else grx_box(56,Y0min+256+250,75,Y0min+261+250,COL_SFONDO);
+ if ( -5>=Velocita_x) grx_box(56,Y0min+249+250,75,Y0min+254+250,GREEN);
+ else grx_box(56,Y0min+249+250,75,Y0min+254+250,COL_SFONDO);
+ if ( -3.75>=Velocita_x)grx_box(56,Y0min+242+250,75,Y0min+247+250,GREEN);
+ else grx_box(56,Y0min+242+250,75,Y0min+247+250,COL_SFONDO);
+ if ( -2.50>=Velocita_x)grx_box(56,Y0min+235+250,75,Y0min+240+250,GREEN);
+ else grx_box(56,Y0min+235+250,75,Y0min+240+250,COL_SFONDO);
+ if ( -1.25>=Velocita_x)grx_box(56,Y0min+228+250,75,Y0min+233+250,GREEN);
+ else grx_box(56,Y0min+228+250,75,Y0min+233+250,COL_SFONDO);
+ //############# ------
+ if ( 1.25<=Velocita_x) grx_box(56,Y0min+221+250,75,Y0min+226+250,GREEN);
+ else grx_box(56,Y0min+221+250,75,Y0min+226+250,COL_SFONDO);
+ if ( 2.50<=Velocita_x) grx_box(56,Y0min+214+250,75,Y0min+219+250,GREEN);
+ else grx_box(56,Y0min+214+250,75,Y0min+219+250,COL_SFONDO);
+ if ( 3.75<=Velocita_x) grx_box(56,Y0min+207+250,75,Y0min+212+250,GREEN);
+ else grx_box(56,Y0min+207+250,75,Y0min+212+250,COL_SFONDO);
+ if (5<=Velocita_x) grx_box(56,Y0min+200+250,75,Y0min+205+250,GREEN);
+ else grx_box(56,Y0min+200+250,75,Y0min+205+250,COL_SFONDO);
+ if ( 6.25<=Velocita_x) grx_box(56,Y0min+193+250,75,Y0min+198+250,GREEN);
+ else grx_box(56,Y0min+193+250,75,Y0min+198+250,COL_SFONDO);
+ if (7.50<=Velocita_x) grx_box(56,Y0min+186+250,75,Y0min+191+250,GREEN);
+ else grx_box(56,Y0min+186+250,75,Y0min+191+250,COL_SFONDO);
+ if (8.75<=Velocita_x) grx_box(56,Y0min+179+250,75,Y0min+184+250,GREEN);
+ else grx_box(56,Y0min+179+250,75,Y0min+184+250,COL_SFONDO);
+ if (10<=Velocita_x) grx_box(56,Y0min+172+250,75,Y0min+177+250,GREEN);
+ else grx_box(56,Y0min+172+250,75,Y0min+177+250,COL_SFONDO);
+ if (11.25<=Velocita_x) grx_box(56,Y0min+165+250,75,Y0min+170+250,GREEN);
+ else grx_box(56,Y0min+165+250,75,Y0min+170+250,COL_SFONDO);
+ if (12.50<=Velocita_x) grx_box(56,Y0min+158+250,75,Y0min+163+250,GREEN);
+ else grx_box(56,Y0min+158+250,75,Y0min+163+250,COL_SFONDO);
+ if (13.75<=Velocita_x) grx_box(56,Y0min+151+250,75,Y0min+156+250,GREEN);
+ else grx_box(56,Y0min+151+250,75,Y0min+156+250,COL_SFONDO);
+ if (15<=Velocita_x) grx_box(56,Y0min+144+250,75,Y0min+149+250,GREEN);
+ else grx_box(56,Y0min+144+250,75,Y0min+149+250,COL_SFONDO);
+ if (16.25<=Velocita_x) grx_box(56,Y0min+137+250,75,Y0min+142+250,YELLOW);
+ else grx_box(56,Y0min+137+250,75,Y0min+142+250,COL_SFONDO);
+ if (17.50<=Velocita_x) grx_box(56,Y0min+130+250,75,Y0min+135+250,YELLOW);
+ else grx_box(56,Y0min+130+250,75,Y0min+135+250,COL_SFONDO);
+ if (18.75<=Velocita_x) grx_box(56,Y0min+123+250,75,Y0min+128+250,RED);
+ else grx_box(56,Y0min+123+250,75,Y0min+128+250,COL_SFONDO);
+ if (20<=Velocita_x) grx_box(56,Y0min+116+250,75,Y0min+121+250,RED);
+ else grx_box(56,Y0min+116+250,75,Y0min+121+250,COL_SFONDO);
+ if (21.25<=Velocita_x) grx_box(56,Y0min+109+250,75,Y0min+114+250,RED);
+ else grx_box(56,Y0min+109+250,75,Y0min+114+250,COL_SFONDO);
+
+ //####################### VELOCITA Y #############################
+ // if ( 160<=Velocita_y)grx_box(81,Y0min+340+250,100,Y0min+345+250,RED);
+ // else grx_box(81,Y0min+340+250,100,Y0min+345+250,COL_SFONDO);
+ if ( 40<=Velocita_y) grx_box(81,Y0min+333+250,100,Y0min+338+250,RED);
+ else grx_box(81,Y0min+333+250,100,Y0min+338+250,COL_SFONDO);
+ if ( 37.5<=Velocita_y)grx_box(81,Y0min+326+250,100,Y0min+331+250,RED);
+ else grx_box(81,Y0min+326+250,100,Y0min+331+250,COL_SFONDO);
+ if ( 35<=Velocita_y)grx_box(81,Y0min+319+250,100,Y0min+324+250,YELLOW);
+ else grx_box(81,Y0min+319+250,100,Y0min+324+250,COL_SFONDO);
+ if ( 32.5<=Velocita_y)grx_box(81,Y0min+312+250,100,Y0min+317+250,YELLOW);
+ else grx_box(81,Y0min+312+250,100,Y0min+317+250,COL_SFONDO);
+ if ( 30<=Velocita_y) grx_box(81,Y0min+305+250,100,Y0min+310+250,GREEN);
+ else grx_box(81,Y0min+305+250,100,Y0min+310+250,COL_SFONDO);
+ if ( 27.5<=Velocita_y)grx_box(81,Y0min+298+250,100,Y0min+303+250,GREEN);
+ else grx_box(81,Y0min+298+250,100,Y0min+303+250,COL_SFONDO);
+ if ( 25<=Velocita_y)grx_box(81,Y0min+291+250,100,Y0min+296+250,GREEN);
+ else grx_box(81,Y0min+291+250,100,Y0min+296+250,COL_SFONDO);
+ if ( 22.5<=Velocita_y)grx_box(81,Y0min+284+250,100,Y0min+289+250,GREEN);
+ else grx_box(81,Y0min+284+250,100,Y0min+289+250,COL_SFONDO);
+ if ( 20<=Velocita_y) grx_box(81,Y0min+277+250,100,Y0min+282+250,GREEN);
+ else grx_box(81,Y0min+277+250,100,Y0min+282+250,COL_SFONDO);
+ if ( 17.5<=Velocita_y) grx_box(81,Y0min+270+250,100,Y0min+275+250,GREEN);
+ else grx_box(81,Y0min+270+250,100,Y0min+275+250,COL_SFONDO);
+ if ( 15<=Velocita_y) grx_box(81,Y0min+263+250,100,Y0min+268+250,GREEN);
+ else grx_box(81,Y0min+263+250,100,Y0min+268+250,COL_SFONDO);
+ if ( 12.5<=Velocita_y) grx_box(81,Y0min+256+250,100,Y0min+261+250,GREEN);
+ else grx_box(81,Y0min+256+250,100,Y0min+261+250,COL_SFONDO);
+ if ( 10<=Velocita_y) grx_box(81,Y0min+249+250,100,Y0min+254+250,GREEN);
+ else grx_box(81,Y0min+249+250,100,Y0min+254+250,COL_SFONDO);
+ if ( 7.5<=Velocita_y) grx_box(81,Y0min+242+250,100,Y0min+247+250,GREEN);
+ else grx_box(81,Y0min+242+250,100,Y0min+247+250,COL_SFONDO);
+ if ( 5<=Velocita_y) grx_box(81,Y0min+235+250,100,Y0min+240+250,GREEN);
+ else grx_box(81,Y0min+235+250,100,Y0min+240+250,COL_SFONDO);
+ if ( 2.5<=Velocita_y) grx_box(81,Y0min+228+250,100,Y0min+233+250,GREEN);
+ else grx_box(81,Y0min+228+250,100,Y0min+233+250,COL_SFONDO);
+ //############# ------
+ if (-2.5>=Velocita_y) grx_box(81,Y0min+221+250,100,Y0min+226+250,GREEN);
+ else grx_box(81,Y0min+221+250,100,Y0min+226+250,COL_SFONDO);
+ if (-5>=Velocita_y) grx_box(81,Y0min+214+250,100,Y0min+219+250,GREEN);
+ else grx_box(81,Y0min+214+250,100,Y0min+219+250,COL_SFONDO);
+ if (-7.5>=Velocita_y) grx_box(81,Y0min+207+250,100,Y0min+212+250,GREEN);
+ else grx_box(81,Y0min+207+250,100,Y0min+212+250,COL_SFONDO);
+ if (-10>=Velocita_y) grx_box(81,Y0min+200+250,100,Y0min+205+250,GREEN);
+ else grx_box(81,Y0min+200+250,100,Y0min+205+250,COL_SFONDO);
+ if (-12.5>=Velocita_y) grx_box(81,Y0min+193+250,100,Y0min+198+250,GREEN);
+ else grx_box(81,Y0min+193+250,100,Y0min+198+250,COL_SFONDO);
+ if (-15>=Velocita_y) grx_box(81,Y0min+186+250,100,Y0min+191+250,GREEN);
+ else grx_box(81,Y0min+186+250,100,Y0min+191+250,COL_SFONDO);
+ if (-17.5>=Velocita_y) grx_box(81,Y0min+179+250,100,Y0min+184+250,GREEN);
+ else grx_box(81,Y0min+179+250,100,Y0min+184+250,COL_SFONDO);
+ if (-20>=Velocita_y) grx_box(81,Y0min+172+250,100,Y0min+177+250,GREEN);
+ else grx_box(81,Y0min+172+250,100,Y0min+177+250,COL_SFONDO);
+ if (-22.5>=Velocita_y) grx_box(81,Y0min+165+250,100,Y0min+170+250,GREEN);
+ else grx_box(81,Y0min+165+250,100,Y0min+170+250,COL_SFONDO);
+ if (-25>=Velocita_y) grx_box(81,Y0min+158+250,100,Y0min+163+250,GREEN);
+ else grx_box(81,Y0min+158+250,100,Y0min+163+250,COL_SFONDO);
+ if (-27.5>=Velocita_y) grx_box(81,Y0min+151+250,100,Y0min+156+250,GREEN);
+ else grx_box(81,Y0min+151+250,100,Y0min+156+250,COL_SFONDO);
+ if (-30>=Velocita_y) grx_box(81,Y0min+144+250,100,Y0min+149+250,GREEN);
+ else grx_box(81,Y0min+144+250,100,Y0min+149+250,COL_SFONDO);
+ if (-32.5>=Velocita_y) grx_box(81,Y0min+137+250,100,Y0min+142+250,YELLOW);
+ else grx_box(81,Y0min+137+250,100,Y0min+142+250,COL_SFONDO);
+ if (-35>=Velocita_y) grx_box(81,Y0min+130+250,100,Y0min+135+250,YELLOW);
+ else grx_box(81,Y0min+130+250,100,Y0min+135+250,COL_SFONDO);
+ if (-37.5>=Velocita_y) grx_box(81,Y0min+123+250,100,Y0min+128+250,RED);
+ else grx_box(81,Y0min+123+250,100,Y0min+128+250,COL_SFONDO);
+ if (-40>=Velocita_y) grx_box(81,Y0min+116+250,100,Y0min+121+250,RED);
+ else grx_box(81,Y0min+116+250,100,Y0min+121+250,COL_SFONDO);
+ if (-42.5>=Velocita_y) grx_box(81,Y0min+109+250,100,Y0min+114+250,RED);
+ else grx_box(81,Y0min+109+250,100,Y0min+114+250,COL_SFONDO);
+
+
+ sem_post(&mutex);
+
+
+ task_endcycle();
+ }
+}
+
+
Index: branches/pj/slsh/slsh.h
===================================================================
--- branches/pj/slsh/slsh.h (nonexistent)
+++ branches/pj/slsh/slsh.h (revision 1085)
@@ -0,0 +1,205 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: slsh.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+ Author: Tomas Lennvall, Date: Feb 2000.
+
+ This file contains the scheduling module for Slot shifting.
+
+ Title:
+ Slot Shifting
+
+ Task Models Accepted:
+ STATIC_TASK_MODEL - Periodic Hard tasks that are scheduled by
+ an off-line scheduler, so that all guarantees regarding precedence, mutex
+ deadline violation is taken care of. The tasks are in an executione schedule,
+ that is the order in when they become ready. They have the following fields:
+ est (earliest start time), wcet and absolute deadline.
+
+ HARD_TASK_MODEL - Hard Tasks (Hard aperiodic requests)
+ wcet field and drel field must be != 0. They are used to set the wcet
+ and deadline of the tasks.
+ periodicity field must be APERIODIC
+ mit field is ignored.
+
+ SOFT_TASK_MODEL - Soft Tasks (Unspecified tasks)
+ wcet field must be != 0. periodicity filed must be APERIODIC
+ period and met filed is ignored.
+
+ Guest Models Accepted:
+ NONE - Slot shifting handles all tasks by itself (at this moment).
+
+ Description:
+ This module schedules the offline scheduled tasks according to the slot-
+ shifting paradigm, dividing time into slots of a fixed length and assigning
+ tasks to execute in those slots. Slot-shifting also keeps track of the free
+ bandwidth in the schedule by using disjoint intervals and sc (spare capacity).
+ Each interval has a sc nr that represents the free bandwidth in that interval,
+ the sc can be used by hard aperiodic tasks, static tasks from later interval or
+ soft aperiodic tasks. Hard aperiodic tasks are guaranteed an incorporated in
+ the schedule by reduction of sc before they execute. No guarantee is
+ performed on the soft aperiodic tasks, they are run when no other task wants
+ to execute and sc is available.
+
+ Description:
+ This module implements the Slot shifting algorithm, by Gerhard Fohler. Slot shifting
+ schedules off-line scheduled tasks and also handles hard aperiodic requests by the
+ guarantee alorithm. Slot shifting can also handle soft aperiodic tasks,
+ called unspecified. That is tasks without a deadline.
+
+ Exceptions raised:
+ These exceptions are pclass-dependent...
+ XDEADLINE_MISS
+ If a task miss his deadline, the exception is raised.
+
+ XWCET_VIOLATION
+ If a task doesn't end the current cycle before if consume the wcet,
+ an exception is raised, and the task is put in the EDF_WCET_VIOLATED
+ state. To reactivate it, use EDF_task_activate via task_activate or
+ manage directly the EDF data structure. Note that the exception is not
+ handled properly, an XDEADLINE_MISS exeeption will also be raised at
+ the period end...
+
+ Restrictions & special features:
+ - This level doesn't manage the main task.
+ - At init time we can choose if the level have to activate
+ . the wcet check
+ (If a task require more time than declared, it is stopped and put in
+ the state EDF_WCET_VIOLATED; a XWCET_VIOLATION exception is raised)
+ . the task guarantee algorithm
+ (when all task are created the system will check that the task_set
+ will not use more than the available bandwidth)
+ - The level use the priority and timespec_priority fields.
+ - A function to return the used bandwidth of a level is provided.
+ - The guest tasks don't provide the guest_endcycle function
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#ifndef __SLSH_H__
+#define __SLSH_H__
+
+#include <ll/ll.h>
+#include <kernel/config.h>
+#include <sys/types.h>
+#include <kernel/types.h>
+#include <modules/codes.h>
+
+#define STATIC_PCLASS 0x0500
+
+#define SLSH_LEVELNAME "Slot Shifting"
+#define SLSH_LEVEL_CODE 5
+#define SLSH_LEVEL_VERSION 1
+
+
+
+/* -----------------------------------------------------------------------
+ STATIC_TASK_MODEL: offline scheduled Tasks
+ ----------------------------------------------------------------------- */
+/* Offline-scheduled tasks are hard periodic tasks that have been
+ scheduled before runtime. All guarantees are made by the off-
+ line scheduler so the tasks are already guaranteed.
+*/
+
+typedef struct {
+ TASK_MODEL t;
+ TIME est;
+ TIME wcet;
+ TIME dabs;
+ int interval; /* used in slot shifting */
+} STATIC_TASK_MODEL;
+
+#define static_task_default_model(m) \
+ task_default_model((m).t,STATIC_PCLASS), \
+ (m).est = -1, \
+ (m).dabs = 0, \
+ (m).wcet = 0, \
+ (m).interval = -1;
+#define static_task_def_level(m,l) task_def_level((m).t,l)
+#define static_task_def_arg(m,a) task_def_arg((m).t,a)
+#define static_task_def_stack(m,s) task_def_stack((m).t,s)
+#define static_task_def_group(m,g) task_def_group((m).t,g)
+#define static_task_def_usemath(m) task_def_usemath((m).t)
+#define static_task_def_system(m) task_def_system((m).t)
+#define static_task_def_nokill(m) task_def_nokill((m).t)
+#define static_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
+#define static_task_def_est(m,p) (m).est = (p)
+#define static_task_def_dabs(m,d) (m).dabs = (d)
+#define static_task_def_wcet(m,w) (m).wcet = (w)
+#define static_task_def_interval(m,i) (m).interval = (i)
+#define static_task_def_trace(m) task_def_trace((m).t)
+#define static_task_def_notrace(m) task_def_notrace((m).t)
+
+
+
+
+/*#define min(a, b) ((a) < (b) ? (a) : (b))*/
+
+#define TIME2TIMESPEC(T, TS) \
+( \
+ ((TS).tv_sec = ((T)/1000000)), \
+ ((TS).tv_nsec = (((T)%1000000) * 1000)), \
+ (TS) \
+)
+
+/* define the interval struct */
+typedef struct {
+ int start; /* start of interval */
+ int end; /* end of interval */
+ int length; /* Length of interval */
+ int maxt; /* maximum execution time in interval */
+ int sc; /* spare capacity in interval */
+} SLSH_interval;
+
+/*+ Registration function: */
+void SLSH_register_level();
+
+void SLSH_set_interval(LEVEL l, int start, int end, int maxt);
+void SLSH_set_variables(LEVEL l, TIME length);
+
+#endif
+
Index: branches/pj/slsh/slsh.c
===================================================================
--- branches/pj/slsh/slsh.c (nonexistent)
+++ branches/pj/slsh/slsh.c (revision 1085)
@@ -0,0 +1,842 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: slsh.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the scheduling module for Slot-Shifting.
+
+ Read slsh.h for further details.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include "slsh.h"
+#include <ll/stdio.h>
+#include <ll/stdlib.h>
+#include <ll/string.h>
+#include <ll/math.h> /* for ceil(...) */
+#include <ll/ll.h> /* for memcpy(...) */
+#include <kernel/model.h>
+#include <kernel/descr.h>
+#include <kernel/var.h>
+#include <kernel/func.h>
+
+//#define eslsh_printf kern_printf
+#define slsh_printf printk
+
+/* Keeps information about static and guaranteed tasks */
+typedef struct {
+ int est;
+ int dabs;
+ int interval;
+} SLSH_task;
+
+/*+ Status used in the level +*/
+#define SLSH_READY MODULE_STATUS_BASE
+#define SLSH_WAIT MODULE_STATUS_BASE + 1
+#define SLSH_IDLE MODULE_STATUS_BASE + 2
+#define SLSH_WCET_VIOLATED MODULE_STATUS_BASE + 3
+
+/*+ defines +*/
+#define MAX_INTERVALS 1000 /* 1000 intervals is max, for now */
+
+/******+ the level redefinition for the SLOT SHIFT level +*******/
+typedef struct {
+ level_des l; /*+ the standard level descriptor+*/
+
+ /* task lists */
+ SLSH_task tasks[MAX_PROC]; /* est and dl's for static and guaranteed task */
+
+ QUEUE idle_statics; /* finished static tasks */
+
+ QQUEUE unspecified; /* tasks with only a wcet */
+
+ /* the Intervals list */
+ SLSH_interval intervals[MAX_INTERVALS];
+ int current; /* current interval */
+ int last; /* last interval */
+
+ int slot; /* slot shifting time */
+ TIME slot_length; /* slothlength in real system time*/
+ int LCM; /* length (in slots) of ofline schedule */
+
+ int slot_event; /* save the event */
+} SLSH_level_des;
+
+
+/* Which task models the Slot-Shifting module accepts */
+static int SLSH_level_accept_task_model(LEVEL l, TASK_MODEL* m)
+{
+ HARD_TASK_MODEL* h;
+ SOFT_TASK_MODEL* s;
+
+ /* Check the models */
+ switch(m->pclass)
+ {
+ case STATIC_PCLASS: /* offline scheduled tasks */
+ return 0;
+ case HARD_PCLASS: /* hard aperiodic tasks */
+ h = (HARD_TASK_MODEL *) m;
+ if(h->drel != 0 && h->wcet != 0) /* must be set */
+ return 0;
+ break;
+ case SOFT_PCLASS: /* soft aperiodic tasks */
+ s = (SOFT_TASK_MODEL *) m;
+ if(s->wcet != 0) /* must be set */
+ return 0;
+ break;
+ default:
+ }
+
+ return -1; /* Not accepted model */
+}
+
+
+static void SLSH_level_status(LEVEL l)
+{
+ kern_printf("Level status not implemented\n");
+}
+
+/* check if some tasks are ready, return 0 if ready, -1 otherwise */
+static int SLSH_R(SLSH_task* tasks)
+{
+ int s;
+
+ /* for all static tasks */
+ for(s = 0; tasks[s].est != -1; ++s)
+ {
+ if(proc_table[s].status == SLSH_READY)
+ return 0;
+ }
+ return -1;
+}
+
+/* check if unspecified exists, return 0 if it exists, -1 otherwise */
+static int SLSH_T(QQUEUE unspecified)
+{
+ if(unspecified.first != NIL)
+ return 0;
+ else
+ return -1;
+}
+
+/* return the sc in an interval */
+static int SLSH_sc(SLSH_interval* intervals, int i)
+{
+ return intervals[i].sc;
+}
+/* return a static task from current interval or a guaranted task */
+static PID SLSH_staticOrGuaranteed(SLSH_level_des* lev)
+{
+ int lowest_dl = 0; /* lowest dl found */
+ PID pid = 0; /* static or guaranteed task */
+ int t;
+
+ /* Decide according to EDF, go through all static & guaranteed tasks */
+ for(t = 0; t < MAX_PROC; ++t)
+ {
+ /* static tasks */
+ if(proc_table[t].pclass == STATIC_PCLASS)
+ {
+ /* static task must belong to current interval */
+ if(lev->tasks[t].interval == lev->current)
+ {
+ /* only ready tasks */
+ if(proc_table[t].status == SLSH_READY)
+ {
+ /* a new lower dl was found */
+ if(lev->tasks[t].dabs < lowest_dl)
+ {
+ lowest_dl = lev->tasks[t].dabs;
+ pid = t;
+ }
+ }
+ }
+ } /* guaranteed tasks */
+ else if(proc_table[t].pclass == HARD_PCLASS)
+ {
+ /* only ready tasks */
+ if(proc_table[t].status == SLSH_READY)
+ {
+ /* a new lower dl was found */
+ if(lev->tasks[t].dabs < lowest_dl)
+ {
+ lowest_dl = lev->tasks[t].dabs;
+ pid = t;
+ }
+ }
+ }
+ }/* for all tasks */
+
+ return pid;
+}
+
+/* return a static task among the candidates, all ready statics */
+static PID SLSH_candidates(SLSH_task* tasks)
+{
+ int lowest_dl = 0;
+ PID pid;
+ int t;
+
+ /* Use the EDL algorithm again to decide which task to run */
+ for(t = 0; t < MAX_PROC; ++t)
+ {
+ /* only static tasks */
+ if(proc_table[t].pclass == STATIC_PCLASS)
+ {
+ /* only ready tasks */
+ if(proc_table[t].status == SLSH_READY)
+ {
+ /* a new lower dl was found */
+ if(tasks[t].dabs < lowest_dl)
+ {
+ lowest_dl = tasks[t].dabs;
+ pid = t;
+ }
+ }/* all ready tasks */
+ }/* all static tasks */
+ }/* for all tasks */
+
+ return pid;
+}
+
+/* decrease the sc in a interval by amount */
+void SLSH_decSc(SLSH_interval* intervals, int i, int amount)
+{
+ intervals[i].sc -= amount;
+}
+
+void SLSH_incSc(SLSH_interval* intervals, int i, int amount)
+{
+ intervals[i].sc += amount;
+}
+
+/* swap the sc between intervals, also consider intervals with negative sc */
+void SLSH_swapSc(SLSH_interval* intervals, int current, int task_interval)
+{
+ /* decrease the sc in the current interval */
+ SLSH_decSc(intervals, current, 1);
+
+ /* update the other interval(s) */
+ if(intervals[task_interval].sc < 0) /* negative sc */
+ {
+ /* special case, increase next interval sc by 1 and also current interval (borrowing) */
+ if(task_interval == current + 1)
+ {
+ SLSH_incSc(intervals, task_interval, 1);
+ SLSH_incSc(intervals, current, 1);
+ }
+ else /* increase every interval sc that is negative between current and task_interval */
+ {
+ while(task_interval > current && intervals[task_interval].sc < 0)
+ {
+ SLSH_incSc(intervals, task_interval, 1);
+ task_interval--;
+ }
+ }
+ }
+ else /* ordinary swapping */
+ SLSH_incSc(intervals, task_interval, 1);
+}
+
+/* The scheduler, decides which task to run. */
+static PID SLSH_level_scheduler(LEVEL l)
+{
+ SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
+ PID pid;
+
+ /* The scheduler choses among static, guaranteed (hard aperiodic) and
+ unspecified (soft aperiodic) tasks */
+ /* no ready tasks and no sc, execute idle task */
+ if(SLSH_R(lev->tasks) == 0 && SLSH_sc(lev->intervals, lev->current) == 0)
+ return NIL;
+ /* must execute a static from current intervall or a guaranteed task */
+ else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) == 0)
+ return SLSH_staticOrGuaranteed(lev);
+ /* sc available... */
+ else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) > 0)
+ {
+ /* If unspecified exist, execute it according to FIFO order */
+ if(SLSH_T(lev->unspecified) == 0)
+ {
+ SLSH_decSc(lev->intervals, lev->current, 1); /* decrease sc by 1 */
+ return (PID)qq_getfirst(&lev->unspecified);
+ }
+ else /* No unspecified, execute task from candidates (statics) */
+ {
+ pid = SLSH_candidates(lev->tasks);
+
+ /* sc needs to be swapped */
+ if(lev->tasks[pid].interval != lev->current)
+ SLSH_swapSc(lev->intervals, lev->tasks[pid].interval, lev->current);
+
+ return pid;
+ }
+ }
+
+ kern_printf("(SLSH s)");
+ return NIL;
+}
+
+/* not used, slot-shifting handles all guarantees itself, it handles all bandwidth */
+static int SLSH_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
+{
+ *freebandwidth = 0;
+ return 1;
+}
+
+/* get the interval that x is in */
+static int SLSH_getInterval(SLSH_interval* intervals, int x, int last)
+{
+ int i;
+
+ /* search through the intervals */
+ for(i = 0; i <= last; ++i)
+ {
+ /* I is in the interval where start is smaller or equal and end is bigger */
+ if(intervals[i].start <= x && x < intervals[i].end)
+ return i;
+ }
+ return -1;
+}
+
+/* get the start of the interval I */
+static int SLSH_intervalStart(SLSH_interval* intervals, int I)
+{
+ return intervals[I].start;
+}
+
+/* split interval I into two parts, slow because of copying. OBS!!! no check if there is
+ enough space in the intervals array */
+static void SLSH_splitInterval(SLSH_level_des* lev, int I, int dabs)
+{
+ SLSH_interval left_interval;
+ int i;
+
+
+ lev->last++;
+
+ /* move every interval above and including I */
+ for(i = lev->last; i > I; --i)
+ memcpy(&lev->intervals[i], &lev->intervals[i - 1], sizeof(SLSH_interval));
+
+ /* Left interval start, end and length */
+ left_interval.start = lev->intervals[I].start;
+ left_interval.end = dabs;
+ left_interval.length = left_interval.end - left_interval.start;
+
+ /* Right interval (uses old interval struct) start and length end remains as the old value */
+ lev->intervals[I + 1].start = dabs;
+ lev->intervals[I + 1].length = lev->intervals[I + 1].end - lev->intervals[I + 1].start;
+
+ /* check if sc still exists in the right interval */
+ if(lev->intervals[I + 1].length - lev->intervals[I + 1].maxt > 0)
+ {
+ lev->intervals[I + 1].sc = lev->intervals[I + 1].length - lev->intervals[I + 1].maxt;
+ left_interval.sc = left_interval.length; /* the whole interval is free, for now... */
+ }
+ else /* no sc in the right interval */
+ {
+ lev->intervals[I + 1].maxt = lev->intervals[I + 1].length;
+ left_interval.sc = lev->intervals[I + 1].sc; /* all sc in left interval */
+ lev->intervals[I + 1].sc = 0;
+ }
+
+ /* insert the new interval */
+ memcpy(&lev->intervals[I], &left_interval, sizeof(SLSH_interval));
+}
+
+/* Reduce the sc from back to front by the wcet amount, interval splitting may be neccesary */
+static void SLSH_updateSc(SLSH_level_des* lev, HARD_TASK_MODEL* h)
+{
+ int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
+ int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
+ int C = ceil(h->wcet/lev->slot_length); /* amount of sc to reduce */
+ int sc = 0;
+ int i;
+
+ /* check if interval splitting is neccesary */
+ if(lev->intervals[dabs_interval].end != dabs)
+ SLSH_splitInterval(lev, dabs_interval, dabs);
+
+ /* decrease sc in all intervals that are neccesary from dabs_interval o current */
+ for(i = dabs_interval; i >= lev->current && C > 0; --i)
+ {
+ if((sc = SLSH_sc(lev->intervals, i)) >= 0) /* only decrease where sc exists */
+ {
+ if(sc > C) /* the last sc dec */
+ {
+ SLSH_decSc(lev->intervals, i, C);
+ C = 0;
+ }
+ else /* to little sc in this interval, decrease it to 0 */
+ {
+ C -= SLSH_sc(lev->intervals, i);
+ SLSH_decSc(lev->intervals, i, SLSH_sc(lev->intervals, i));
+ }
+ }
+ }/* for all intervals */
+}
+
+/* the guarantee algorithm for hard aperiodic requests */
+static int SLSH_guarantee(SLSH_level_des* lev, HARD_TASK_MODEL* h)
+{
+ int total_sc = 0;
+ int temp, i;
+ int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
+ int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
+
+ /* check if the sc up until request deadline is >= request wcet */
+ /* 1. the sc of the current interal */
+ total_sc = SLSH_sc(lev->intervals, lev->current);
+
+ /* 2. the sc for all whole intervals between current and the interval
+ with the request deadline */
+ for(i = (lev->current) + 1; i < dabs_interval; ++i)
+ {
+ if((temp = SLSH_sc(lev->intervals, i)) > 0)
+ total_sc += temp;
+ }
+
+ /* 3. the min of sc or the execution need in the last interval */
+ total_sc += min(SLSH_sc(lev->intervals, dabs_interval),
+ dabs - SLSH_intervalStart(lev->intervals,
+ dabs_interval));
+
+ if(total_sc >= h->wcet)
+ { /* update the sc in the intervals from back to front */
+ SLSH_updateSc(lev, h);
+ return 0;
+ }
+ else
+ return -1;
+}
+
+/* check if task model is accepted and store nessecary parameters */
+static int SLSH_task_create(LEVEL l, PID p, TASK_MODEL *m)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+ STATIC_TASK_MODEL* s;
+ HARD_TASK_MODEL* h;
+ SOFT_TASK_MODEL* u;
+
+ /* if the SLSH_task_create is called, then the pclass must be a
+ valid pclass. Slot-shifting accepts STATIC_TASK, HARD_TASK
+ and SOFT_TASK models with some restrictions */
+
+ /* est, dl and wcet is saved in slotlengths */
+ switch(m->pclass)
+ {
+ case STATIC_PCLASS: /* offline scheduled tasks */
+ s = (STATIC_TASK_MODEL *) m;
+ lev->tasks[p].est = ceil(s->est/lev->slot_length);
+ lev->tasks[p].dabs = ceil(s->dabs/lev->slot_length);
+ lev->tasks[p].interval = s->interval;
+ proc_table[p].avail_time = s->wcet;
+ proc_table[p].wcet = s->wcet;
+ break;
+ case HARD_PCLASS: /* hard aperiodic tasks */
+ h = (HARD_TASK_MODEL *) m;
+ if(SLSH_guarantee(lev, h) == 0)
+ {
+ /* convert drel to dabs */
+ lev->tasks[p].dabs = ceil((lev->slot + h->drel)/lev->slot_length);
+ proc_table[p].avail_time = h->wcet;
+ proc_table[p].wcet = h->wcet;
+ }
+ else /* task not guaranteed */
+ return -1;
+ break;
+ case SOFT_PCLASS:
+ u = (SOFT_TASK_MODEL *) m;
+ proc_table[p].avail_time = u->wcet;
+ proc_table[p].wcet = u->wcet;
+ qq_insertlast(p, &lev->unspecified); /* respect FIFO order */
+ break;
+ default: /* a task model not supported */
+ return -1;
+ }
+ /* enable wcet check in the kernel */
+ proc_table[p].control |= CONTROL_CAP;
+
+ return 0;
+}
+
+static void SLSH_task_detach(LEVEL l, PID p)
+{
+ /* do nothing */
+}
+
+/* check if a task chosen by scheduler is correct */
+static int SLSH_task_eligible(LEVEL l, PID p)
+{
+ return 0; /* if the task p is chosen, it is always eligible */
+}
+
+/************* The slot end event handler *************/
+static void SLSH_slot_end(void* p)
+{
+ SLSH_level_des* lev = (SLSH_level_des *) p;
+ PID pid;
+ int i;
+
+ /* increase slot "time" by 1 */
+ if(lev->slot < lev->LCM)
+ {
+ lev->slot++;
+ /* check if new statics are ready */
+ for(i = 0; lev->tasks[i].interval != -1; ++i)
+ {
+ if(lev->tasks[i].est <= lev->slot && proc_table[i].status == SLSH_WAIT)
+ proc_table[i].status = SLSH_READY;
+ }
+
+ /* check if current (interval) needs updating */
+ if(lev->current < SLSH_getInterval(lev->intervals, lev->slot, lev->last))
+ lev->current++;
+
+ }
+ else /* restart from the beginning of the offline schedule */
+ {
+ lev->slot = 0;
+
+ while((pid = q_getfirst(&lev->idle_statics)) != NIL)
+ {
+ if(lev->tasks[pid].est <= lev->slot)
+ proc_table[pid].status = SLSH_READY;
+ else
+ proc_table[pid].status = SLSH_WAIT;
+ }
+ }
+
+ /* call for a rescheduling, reset event flag and increase slot by 1 */
+ lev->slot_event = -1;
+ kern_printf("*");
+ event_need_reschedule();
+}
+
+/* when a task becomes executing (EXE status) */
+static void SLSH_task_dispatch(LEVEL l, PID pid, int nostop)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+ struct timespec t;
+
+ /* the task state is set EXE by the scheduler()
+ we extract the task from the unspecified queue.
+ NB: we can't assume that p is the first task in the queue!!! */
+
+ if(proc_table[pid].pclass == SOFT_PCLASS)
+ qq_extract(pid, &lev->unspecified);
+
+ /* also start the timer for one slot length */
+ lev->slot_event = kern_event_post(&TIME2TIMESPEC(lev->slot_length, t),
+ SLSH_slot_end, (void*) lev);
+}
+
+/* called when task is moved from EXE status */
+static void SLSH_task_epilogue(LEVEL l, PID pid)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+
+ /* check if the wcet is finished... */
+ if (proc_table[pid].avail_time <= 0)
+ {
+ /* if it is, raise a XWCET_VIOLATION exception */
+ kern_raise(XWCET_VIOLATION, pid);
+ proc_table[pid].status = SLSH_WCET_VIOLATED;
+ }
+ else /* the end of a slot. the task returns into the ready queue... */
+ {
+ if(proc_table[pid].pclass == SOFT_PCLASS)
+ qq_insertfirst(pid,&lev->unspecified);
+
+ proc_table[pid].status = SLSH_READY;
+ }
+}
+
+/* when task go from SLEEP to SLSH_READY or SLSH_WAIT */
+static void SLSH_task_activate(LEVEL l, PID pid)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+ WORD type = proc_table[pid].pclass;
+
+ /* Test if we are trying to activate a non sleeping task */
+ /* Ignore this; the task is already active */
+ if (proc_table[pid].status != SLEEP && proc_table[pid].status != SLSH_WCET_VIOLATED)
+ return;
+
+ /* make task ready or waiting, dependong on slot (the time) for static tasks only*/
+ if(type == STATIC_PCLASS && lev->tasks[pid].est <= lev->slot)
+ proc_table[pid].status = SLSH_READY;
+ else
+ proc_table[pid].status = SLSH_WAIT;
+
+ if(type == HARD_PCLASS)
+ proc_table[pid].status = SLSH_READY;
+
+ /* insert unspecified tasks in QQUEUE and make it ready */
+ if(type == SOFT_PCLASS)
+ {
+ qq_insertlast(pid ,&lev->unspecified);
+ proc_table[pid].status = SLSH_READY;
+ }
+}
+
+/* when a task i returned to module from a semaphore, mutex ... */
+static void SLSH_task_insert(LEVEL l, PID pid)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+
+ /* change staus of task */
+ proc_table[pid].status = SLSH_READY;
+
+ if(proc_table[pid].pclass == SOFT_PCLASS)
+ qq_insertfirst(pid ,&lev->unspecified);
+}
+
+/* when a semaphore, mutex ... taskes a task from module */
+static void SLSH_task_extract(LEVEL l, PID pid)
+{
+ /* Extract the running task from the level
+ . we have already extract it from the ready queue at the dispatch time.
+ . the capacity event have to be removed by the generic kernel
+ . the wcet don't need modification...
+ . the state of the task is set by the calling function
+ . the deadline must remain...
+
+ So, we do nothing!!!
+ */
+}
+
+/* task has finished execution for this period */
+static void SLSH_task_endcycle(LEVEL l, PID pid)
+{
+ /* do nothing */
+}
+
+/* the task has finihed its wcet, kill task (dont kill static tasks) */
+static void SLSH_task_end(LEVEL l, PID pid)
+{
+ SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
+
+ if(proc_table[pid].pclass == SOFT_PCLASS)
+ {
+ if (proc_table[pid].status == SLSH_READY)
+ qq_extract(pid, &lev->unspecified);
+ }
+ else if(proc_table[pid].pclass == HARD_PCLASS)
+ {
+ if (proc_table[pid].status == SLSH_READY)
+ lev->tasks[pid].dabs = 0;
+
+ }
+ /* static tasks: put them in idle QUEUE, reset status and avail_time */
+ else if(proc_table[pid].pclass == STATIC_PCLASS)
+ {
+ proc_table[pid].avail_time = proc_table[pid].wcet;
+ proc_table[pid].status = SLSH_IDLE;
+ q_insert(pid, &lev->idle_statics);
+ }
+
+ proc_table[pid].status = FREE;
+}
+
+/* called when a task should sleep but not execute for awhile, mabe a mode change */
+static void SLSH_task_sleep(LEVEL l, PID pid)
+{
+
+ /* the task has terminated his job before it consume the wcet. All OK! */
+ proc_table[pid].status = SLEEP;
+
+ /* we reset the capacity counters... only for static tasks */
+ if (proc_table[pid].pclass == STATIC_PCLASS)
+ proc_table[pid].avail_time = proc_table[pid].wcet;
+
+}
+
+static void SLSH_task_delay(LEVEL l, PID p, TIME usdelay) { }
+
+/** Guest Functions, slot shifing accepts no guests, so all generates exceptions **/
+
+static int SLSH_level_accept_guest_model(LEVEL l, TASK_MODEL* m) { return -1; }
+
+static int SLSH_guest_create(LEVEL l, PID p, TASK_MODEL *m)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
+
+static void SLSH_guest_detach(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_dispatch(LEVEL l, PID p, int nostop)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_epilogue(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_activate(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_insert(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_extract(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_endcycle(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_end(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_sleep(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void SLSH_guest_delay(LEVEL l, PID p, TIME usdelay)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+/******* Registration functions *******/
+
+/*+ Registration function: */
+void SLSH_register_level()
+{
+ LEVEL l; /* the level that we register */
+ SLSH_level_des *lev; /* for readableness only */
+ PID i; /* a counter */
+
+ kern_printf("SLSH_register_level\n");
+
+ /* request an entry in the level_table */
+ l = level_alloc_descriptor();
+
+ /* alloc the space needed for the EDF_level_des */
+ lev = (SLSH_level_des *)kern_alloc(sizeof(SLSH_level_des));
+
+ /* update the level_table with the new entry */
+ level_table[l] = (level_des *)lev;
+
+ /* fill the standard descriptor */
+ strncpy(lev->l.level_name, SLSH_LEVELNAME, MAX_LEVELNAME);
+
+ lev->l.level_code = SLSH_LEVEL_CODE;
+ lev->l.level_version = SLSH_LEVEL_VERSION;
+
+ lev->l.level_accept_task_model = SLSH_level_accept_task_model;
+ lev->l.level_accept_guest_model = SLSH_level_accept_guest_model;
+ lev->l.level_status = SLSH_level_status;
+ lev->l.level_scheduler = SLSH_level_scheduler;
+
+ lev->l.level_guarantee = SLSH_level_guarantee;
+
+ lev->l.task_create = SLSH_task_create;
+ lev->l.task_detach = SLSH_task_detach;
+ lev->l.task_eligible = SLSH_task_eligible;
+ lev->l.task_dispatch = SLSH_task_dispatch;
+ lev->l.task_epilogue = SLSH_task_epilogue;
+ lev->l.task_activate = SLSH_task_activate;
+ lev->l.task_insert = SLSH_task_insert;
+ lev->l.task_extract = SLSH_task_extract;
+ lev->l.task_endcycle = SLSH_task_endcycle;
+ lev->l.task_end = SLSH_task_end;
+ lev->l.task_sleep = SLSH_task_sleep;
+ lev->l.task_delay = SLSH_task_delay;
+
+ lev->l.guest_create = SLSH_guest_create;
+ lev->l.guest_detach = SLSH_guest_detach;
+ lev->l.guest_dispatch = SLSH_guest_dispatch;
+ lev->l.guest_epilogue = SLSH_guest_epilogue;
+ lev->l.guest_activate = SLSH_guest_activate;
+ lev->l.guest_insert = SLSH_guest_insert;
+ lev->l.guest_extract = SLSH_guest_extract;
+ lev->l.guest_endcycle = SLSH_guest_endcycle;
+ lev->l.guest_end = SLSH_guest_end;
+ lev->l.guest_sleep = SLSH_guest_sleep;
+ lev->l.guest_delay = SLSH_guest_delay;
+
+ /* fill the SLSH descriptor part */
+ for(i = 0; i < MAX_PROC; i++)
+ {
+ lev->tasks[i].est = -1;
+ lev->tasks[i].dabs = 0;
+ lev->tasks[i].interval = -1;
+ }
+
+ for(i = 0; i < MAX_INTERVALS; i++)
+ {
+ lev->intervals[i].start = -1;
+ lev->intervals[i].end = -1;
+ lev->intervals[i].length = 0;
+ lev->intervals[i].maxt = 0;
+ lev->intervals[i].sc = 0;
+ }
+
+ lev->current = 0;
+ lev->last = NIL;
+ lev->slot = 0;
+ lev->slot_length = 0;
+ lev->slot_event = -1;
+}
+
+
+void SLSH_set_interval(LEVEL l, int start, int end, int maxt)
+{
+ SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
+ static int i = -1;
+
+ i++;
+ lev->intervals[i].start = start;
+ lev->intervals[i].end = end;
+ lev->intervals[i].length = end - start;
+ lev->intervals[i].maxt = maxt;
+ lev->intervals[i].sc = lev->intervals[i].length - maxt;
+
+ lev->last = i;
+}
+
+void SLSH_set_variables(LEVEL l, TIME length)
+{
+ SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
+
+ lev->slot_length = length;
+}
Index: branches/pj/slsh/slshtest.c
===================================================================
--- branches/pj/slsh/slshtest.c (nonexistent)
+++ branches/pj/slsh/slshtest.c (revision 1085)
@@ -0,0 +1,173 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: slshtest.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ Slot shifting test
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and Tomas Lennvall
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <kernel/config.h>
+#include "kernel/kern.h"
+#include "slsh.h"
+#include "drivers/keyb.h"
+
+/* a slot length of 100 ms */
+#define SLOT_LENGTH 100000
+
+
+TASK static1(void)
+{
+ int i = 0;
+
+ kern_printf("Static1\n");
+ while(sys_gettime(NULL) < 10000) i++;
+
+ return 0;
+}
+
+TASK static2(void)
+{
+ int i = 0;
+
+ kern_printf("Static2\n");
+ while(sys_gettime(NULL) < 10000) i++;
+
+ return 0;
+}
+
+
+TASK static3(void)
+{
+ kern_printf("Static3\n");
+
+ return 0;
+}
+
+void my_end(KEY_EVT *e)
+{
+ sys_end();
+}
+
+int main(int argc, char** argv)
+{
+ STATIC_TASK_MODEL s;
+ // HARD_TASK_MODEL h_aper;
+ // SOFT_TASK_MODEL u;
+ PID p1,p2,p3;
+ struct timespec x;
+
+ KEY_EVT emerg;
+
+ kern_cli();
+ x.tv_sec=5;
+ kern_event_post(&x,(void (*)(void *))sys_end,NULL);
+ kern_sti();
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,my_end);
+
+ /* set som variables in the scheduling level */
+ SLSH_set_interval(0, 0, 8, 5);
+ SLSH_set_interval(0, 8, 17, 7);
+ SLSH_set_interval(0, 17, 20, 1);
+
+ SLSH_set_variables(0, SLOT_LENGTH);
+
+ static_task_default_model(s);
+ static_task_def_group(s, 1);
+
+ /* define time i ms */
+ /* static1 task */
+ static_task_def_est(s, 0);
+ static_task_def_dabs(s, 800000);
+ static_task_def_wcet(s, 500000);
+ static_task_def_interval(s, 0);
+
+ kern_printf("In main, before task creation\n");
+
+ p1 = task_create("Static 1", static1, &s, NULL);
+ if(p1 == NIL)
+ kern_printf("Cannot create: Static1!\n");
+
+ /* Static2 task */
+ static_task_def_est(s, 800000);
+ static_task_def_dabs(s, 1700000);
+ static_task_def_wcet(s, 700000);
+ static_task_def_interval(s, 1);
+
+ p2 = task_create("Static 2", static2, &s, NULL);
+ if(p2 == NIL)
+ kern_printf("Cannot create: Static2!\n");
+
+ /* Static3 task */
+ static_task_def_est(s, 1700000);
+ static_task_def_dabs(s, 2000000);
+ static_task_def_wcet(s, 100000);
+ static_task_def_interval(s, 2);
+
+
+ p3 = task_create("Static3", static3, &s, NULL);
+ if(p3 == NIL)
+ kern_printf("Cannot create: Static3!\n");
+
+
+ /* End task */
+ /*hard_task_default_model(h_aper);
+
+
+ hard_task_def_wcet(h_aper, 100000);
+ */
+ kern_printf("After task creation\n");
+
+ group_activate(1);
+
+ return 0;
+}
Index: branches/pj/slsh/readme.txt
===================================================================
--- branches/pj/slsh/readme.txt (nonexistent)
+++ branches/pj/slsh/readme.txt (revision 1085)
@@ -0,0 +1,6 @@
+This Example has been made by Tomas Lenvall.
+
+There is not a lot of documentation available, so if you have problems please
+send an e-mail to Tomas ( mailto:tlv@mdh.se )
+
+Paolo
Index: branches/pj/slsh/makefile
===================================================================
--- branches/pj/slsh/makefile (nonexistent)
+++ branches/pj/slsh/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+
+include $(BASE)/config/config.mk
+
+PROGS=slshtest
+
+include $(BASE)/config/example.mk
+
+slshtest:
+ make -f $(SUBMAKE) APP=slshtest INIT= OTHEROBJS="slshinit.o slsh.o" OTHERINCL=
Index: branches/pj/slsh/slshinit.c
===================================================================
--- branches/pj/slsh/slshinit.c (nonexistent)
+++ branches/pj/slsh/slshinit.c (revision 1085)
@@ -0,0 +1,117 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: slshinit.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ System initialization file
+
+ The tick is set to TICK ms.
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ a Slot Shifting level
+ a Dummy level
+
+ It can accept these task models:
+
+ STATIC_TASK_MODEL
+ HARD_TASK_MODEL(aperiodic)
+ SOFT_TASK_MODEL
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "slsh.h"
+#include "modules/rr2.h"
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "drivers/keyb.h"
+#include "modules/dummy.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 300
+
+/* define RR tick in us*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ SLSH_register_level();
+ RR2_register_level(RRTICK, RR2_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ return TICK;
+}
+
+NRT_TASK_MODEL nrt;
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS k = BASE_KEYB;
+
+ nrt_task_default_model(nrt);
+ keyb_def_task(k,&nrt);
+
+
+
+ HARTPORT_init();
+
+ KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return 0;
+}
+
+
Index: branches/pj/mpeg2/ieee1180
===================================================================
--- branches/pj/mpeg2/ieee1180 (nonexistent)
+++ branches/pj/mpeg2/ieee1180 (revision 1085)
@@ -0,0 +1,245 @@
+IEEE 1180 report for mpeg2decode fast integer IDCT:
+
+From stefan@lis.e-technik.tu-muenchen.de Thu May 26 08:18:36 1994
+
+IEEE test conditions: -L = -256, +H = 255, sign = 1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0058 0.0118 0.0097 0.0057 0.0055 0.0117 0.0120 0.0063
+ 0.0106 0.0157 0.0142 0.0099 0.0115 0.0168 0.0154 0.0123
+ 0.0128 0.0156 0.0152 0.0095 0.0115 0.0147 0.0173 0.0096
+ 0.0055 0.0115 0.0103 0.0078 0.0069 0.0092 0.0113 0.0071
+ 0.0057 0.0134 0.0123 0.0067 0.0050 0.0109 0.0128 0.0065
+ 0.0101 0.0172 0.0159 0.0093 0.0097 0.0148 0.0163 0.0130
+ 0.0113 0.0171 0.0148 0.0103 0.0110 0.0153 0.0149 0.0093
+ 0.0064 0.0123 0.0104 0.0065 0.0064 0.0111 0.0099 0.0066
+Worst pmse = 0.017300 (meets spec limit 0.06)
+Overall mse = 0.010998 (meets spec limit 0.02)
+
+Mean errors:
+ 0.0014 0.0004 0.0003 0.0017 0.0003 0.0011 0.0010 -0.0001
+ 0.0000 0.0003 0.0010 0.0003 0.0007 -0.0006 0.0004 0.0033
+ 0.0000 -0.0008 -0.0006 0.0009 -0.0015 -0.0013 -0.0017 -0.0008
+ -0.0017 0.0019 -0.0005 0.0010 0.0005 0.0000 -0.0017 -0.0001
+ 0.0007 0.0034 0.0015 0.0021 0.0016 0.0007 -0.0006 0.0011
+ -0.0007 0.0004 -0.0001 0.0003 0.0003 0.0004 0.0031 -0.0010
+ 0.0009 -0.0005 -0.0004 0.0003 0.0008 -0.0015 -0.0007 -0.0007
+ 0.0024 0.0001 0.0018 -0.0003 -0.0006 -0.0001 0.0009 0.0018
+Worst mean error = 0.003400 (meets spec limit 0.015)
+Overall mean error = 0.000352 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.8u 0.1s 0:27 95% 0+216k 0+2io 0pf+0w
+IEEE test conditions: -L = -5, +H = 5, sign = 1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0008 0.0008 0.0006 0.0006 0.0006 0.0006 0.0007 0.0005
+ 0.0005 0.0003 0.0005 0.0001 0.0003 0.0007 0.0007 0.0004
+ 0.0004 0.0012 0.0011 0.0007 0.0010 0.0008 0.0010 0.0003
+ 0.0004 0.0004 0.0001 0.0002 0.0004 0.0007 0.0009 0.0004
+ 0.0005 0.0005 0.0004 0.0002 0.0006 0.0004 0.0012 0.0003
+ 0.0008 0.0006 0.0007 0.0007 0.0003 0.0012 0.0011 0.0004
+ 0.0006 0.0002 0.0001 0.0002 0.0005 0.0005 0.0007 0.0005
+ 0.0008 0.0004 0.0006 0.0003 0.0008 0.0006 0.0002 0.0003
+Worst pmse = 0.001200 (meets spec limit 0.06)
+Overall mse = 0.000561 (meets spec limit 0.02)
+
+Mean errors:
+ 0.0008 0.0006 0.0000 0.0006 0.0006 0.0002 0.0005 0.0003
+ 0.0005 0.0003 0.0003 0.0001 0.0001 0.0001 0.0005 0.0002
+ 0.0004 0.0006 0.0005 0.0007 0.0006 0.0004 0.0002 -0.0001
+ 0.0002 0.0002 0.0001 0.0002 0.0004 0.0005 0.0003 0.0002
+ 0.0003 0.0003 0.0004 0.0002 0.0006 0.0000 0.0002 0.0003
+ -0.0002 0.0004 0.0007 0.0005 0.0001 0.0010 0.0005 -0.0002
+ 0.0004 0.0000 0.0001 0.0000 0.0001 0.0003 0.0005 0.0003
+ 0.0006 0.0000 0.0002 0.0003 0.0004 0.0002 0.0002 0.0001
+Worst mean error = 0.001000 (meets spec limit 0.015)
+Overall mean error = 0.000311 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.7u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
+IEEE test conditions: -L = -300, +H = 300, sign = 1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0068 0.0097 0.0119 0.0064 0.0065 0.0105 0.0112 0.0050
+ 0.0088 0.0130 0.0128 0.0088 0.0111 0.0152 0.0139 0.0109
+ 0.0114 0.0127 0.0157 0.0099 0.0114 0.0137 0.0153 0.0109
+ 0.0052 0.0097 0.0120 0.0060 0.0067 0.0114 0.0099 0.0065
+ 0.0062 0.0096 0.0091 0.0064 0.0076 0.0092 0.0111 0.0058
+ 0.0096 0.0139 0.0166 0.0112 0.0092 0.0141 0.0122 0.0103
+ 0.0121 0.0138 0.0131 0.0089 0.0108 0.0172 0.0127 0.0104
+ 0.0070 0.0109 0.0092 0.0055 0.0057 0.0128 0.0102 0.0069
+Worst pmse = 0.017200 (meets spec limit 0.06)
+Overall mse = 0.010316 (meets spec limit 0.02)
+
+Mean errors:
+ -0.0010 0.0015 0.0001 -0.0004 0.0005 -0.0001 0.0008 0.0000
+ 0.0004 0.0016 0.0006 0.0000 -0.0001 0.0004 0.0011 0.0001
+ -0.0008 0.0013 0.0015 0.0003 0.0010 0.0005 -0.0005 0.0021
+ 0.0006 0.0013 -0.0004 0.0000 0.0007 -0.0002 -0.0009 0.0003
+ 0.0004 0.0004 -0.0001 -0.0004 0.0014 0.0018 0.0017 -0.0002
+ 0.0024 0.0007 -0.0002 -0.0018 0.0004 0.0001 0.0010 0.0009
+ 0.0001 -0.0002 0.0005 0.0003 -0.0016 0.0004 0.0013 -0.0006
+ -0.0012 -0.0017 -0.0008 0.0003 0.0001 0.0018 0.0008 -0.0005
+Worst mean error = 0.002400 (meets spec limit 0.015)
+Overall mean error = 0.000309 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.8u 0.0s 0:27 95% 0+216k 0+4io 0pf+0w
+IEEE test conditions: -L = -256, +H = 255, sign = -1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0061 0.0118 0.0097 0.0057 0.0058 0.0113 0.0115 0.0061
+ 0.0105 0.0159 0.0138 0.0097 0.0113 0.0166 0.0149 0.0123
+ 0.0129 0.0155 0.0152 0.0095 0.0112 0.0145 0.0173 0.0094
+ 0.0059 0.0112 0.0105 0.0076 0.0071 0.0091 0.0113 0.0073
+ 0.0061 0.0130 0.0128 0.0066 0.0051 0.0108 0.0126 0.0067
+ 0.0099 0.0168 0.0161 0.0095 0.0100 0.0149 0.0166 0.0132
+ 0.0113 0.0171 0.0150 0.0101 0.0110 0.0157 0.0152 0.0094
+ 0.0062 0.0121 0.0102 0.0065 0.0061 0.0112 0.0099 0.0065
+Worst pmse = 0.017300 (meets spec limit 0.06)
+Overall mse = 0.010980 (meets spec limit 0.02)
+
+Mean errors:
+ -0.0005 0.0006 0.0001 -0.0007 0.0006 -0.0003 -0.0003 0.0011
+ 0.0011 0.0003 -0.0002 0.0005 -0.0001 0.0008 0.0001 -0.0027
+ 0.0013 0.0015 0.0010 -0.0001 0.0020 0.0019 0.0025 0.0016
+ 0.0023 -0.0008 0.0011 -0.0002 0.0007 0.0003 0.0019 0.0009
+ -0.0003 -0.0030 -0.0002 -0.0012 -0.0009 0.0000 0.0010 -0.0005
+ 0.0009 0.0002 0.0015 0.0007 0.0002 0.0001 -0.0026 0.0018
+ 0.0001 0.0011 0.0010 0.0005 -0.0004 0.0023 0.0014 0.0014
+ -0.0014 0.0007 -0.0014 0.0009 0.0013 0.0006 -0.0007 -0.0007
+Worst mean error = 0.003000 (meets spec limit 0.015)
+Overall mean error = 0.000355 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.8u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
+IEEE test conditions: -L = -5, +H = 5, sign = -1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0010 0.0007 0.0008 0.0004 0.0008 0.0004 0.0005 0.0007
+ 0.0005 0.0007 0.0005 0.0004 0.0006 0.0005 0.0005 0.0003
+ 0.0003 0.0011 0.0009 0.0007 0.0008 0.0006 0.0011 0.0006
+ 0.0003 0.0004 0.0002 0.0002 0.0003 0.0006 0.0008 0.0006
+ 0.0004 0.0005 0.0006 0.0006 0.0003 0.0007 0.0007 0.0003
+ 0.0013 0.0006 0.0008 0.0005 0.0004 0.0006 0.0008 0.0004
+ 0.0003 0.0003 0.0003 0.0002 0.0005 0.0004 0.0006 0.0005
+ 0.0005 0.0003 0.0006 0.0005 0.0011 0.0007 0.0005 0.0003
+Worst pmse = 0.001300 (meets spec limit 0.06)
+Overall mse = 0.000561 (meets spec limit 0.02)
+
+Mean errors:
+ 0.0002 0.0005 0.0008 0.0000 0.0002 0.0004 0.0003 0.0007
+ 0.0001 0.0003 0.0003 0.0002 0.0006 0.0003 0.0001 0.0003
+ -0.0001 0.0007 0.0003 0.0001 0.0002 0.0006 0.0005 0.0006
+ 0.0001 0.0004 0.0002 0.0002 0.0001 0.0002 0.0004 0.0004
+ 0.0002 0.0005 0.0006 0.0004 0.0001 0.0005 0.0005 0.0003
+ 0.0009 0.0002 0.0000 0.0001 0.0004 0.0000 0.0006 0.0004
+ 0.0003 0.0003 0.0003 0.0002 0.0003 0.0000 0.0004 0.0003
+ 0.0003 0.0003 0.0004 0.0003 0.0007 0.0005 0.0005 0.0003
+Worst mean error = 0.000900 (meets spec limit 0.015)
+Overall mean error = 0.000333 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.7u 0.1s 0:27 95% 0+216k 0+0io 0pf+0w
+IEEE test conditions: -L = -300, +H = 300, sign = -1, #iters = 10000
+Peak absolute values of errors:
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+Worst peak error = 1 (meets spec limit 1)
+
+Mean square errors:
+ 0.0067 0.0097 0.0118 0.0060 0.0066 0.0107 0.0113 0.0049
+ 0.0082 0.0132 0.0128 0.0088 0.0110 0.0152 0.0140 0.0109
+ 0.0122 0.0125 0.0156 0.0098 0.0113 0.0139 0.0152 0.0106
+ 0.0054 0.0097 0.0121 0.0064 0.0067 0.0110 0.0096 0.0062
+ 0.0064 0.0099 0.0090 0.0067 0.0078 0.0089 0.0112 0.0057
+ 0.0098 0.0136 0.0165 0.0111 0.0090 0.0138 0.0120 0.0103
+ 0.0121 0.0135 0.0131 0.0087 0.0107 0.0168 0.0128 0.0102
+ 0.0069 0.0109 0.0091 0.0057 0.0061 0.0125 0.0103 0.0070
+Worst pmse = 0.016800 (meets spec limit 0.06)
+Overall mse = 0.010283 (meets spec limit 0.02)
+
+Mean errors:
+ 0.0015 -0.0009 0.0006 0.0012 0.0002 0.0007 -0.0001 0.0005
+ 0.0004 -0.0010 0.0000 0.0004 0.0006 0.0004 -0.0004 0.0007
+ 0.0018 -0.0009 -0.0006 0.0000 -0.0003 -0.0001 0.0014 -0.0006
+ -0.0002 -0.0011 0.0009 0.0004 -0.0003 0.0010 0.0010 0.0000
+ 0.0004 0.0001 0.0010 0.0011 -0.0008 -0.0017 -0.0006 0.0009
+ -0.0020 0.0000 0.0007 0.0021 0.0002 0.0002 -0.0004 -0.0003
+ 0.0003 0.0005 -0.0003 -0.0001 0.0017 0.0002 -0.0004 0.0010
+ 0.0015 0.0023 0.0013 0.0003 0.0005 -0.0011 -0.0003 0.0006
+Worst mean error = 0.002300 (meets spec limit 0.015)
+Overall mean error = 0.000252 (meets spec limit 0.0015)
+
+0 elements of IDCT(0) were not zero
+
+
+25.8u 0.0s 0:27 94% 0+216k 0+3io 0pf+0w
+
Index: branches/pj/mpeg2/makefile.lib
===================================================================
--- branches/pj/mpeg2/makefile.lib (nonexistent)
+++ branches/pj/mpeg2/makefile.lib (revision 1085)
@@ -0,0 +1,54 @@
+#
+# The mpeg library
+#
+
+# (see sources for copyrights)
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+LIBRARY = mpeg2
+
+OBJS_PATH = $(BASE)/ports/mpeg2
+
+DECODER_SRC = util.c \
+ video.c \
+ parseblock.c \
+ motionvector.c \
+ decoders.c \
+ jrevdct.c \
+ wrapper.c \
+ gdith.c \
+ gdithmni.c \
+ readfile.c \
+ 16bit.c
+
+DITHER_SRC = fs2.c \
+ fs2fast.c \
+ fs4.c \
+ hybrid.c \
+ hybriderr.c \
+ 2x2.c \
+ gray.c \
+ mono.c \
+ ordered.c \
+ ordered2.c \
+ mb_ordered.c
+
+SRCS= $(DECODER_SRC) $(DITHER_SRC)
+
+OBJS= mpeg2dec.o getpic.o motion.o getvlc.o \
+ gethdr.o getblk.o getbits.o store.o \
+ recon.o spatscal.o idct.o idctref.o \
+ display.o systems.o subspic.o verify.o
+
+#C_WARN += -Wno-unused -Wno-uninitialized -Wno-implicit-function-declaration \
+# -Wno-switch -Wno-return-type
+
+#C_DEF += -DNOCONTROLS
+#C_INC += -I.
+
+include $(BASE)/config/lib.mk
+
Index: branches/pj/mpeg2/jetctrl.c
===================================================================
--- branches/pj/mpeg2/jetctrl.c (nonexistent)
+++ branches/pj/mpeg2/jetctrl.c (revision 1085)
@@ -0,0 +1,163 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * this file is directly derived from the demos/jumpball/jetctrl.c .
+ * I just added this controls to check when the system will become overloaded
+ */
+
+#define WCET_JETDUMMY 200
+#define PERIOD_JETDUMMY 100000
+#define DUMMY_PID 1
+
+#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
+#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
+
+/* the point (x, y) is the top left corner */
+#define JET_DUMMY_X (TRACK_X1+360)
+#define JET_DUMMY_Y (TRACK_Y2+32)
+
+// from jetdummy in the auto demo
+#define SCREEN_WIDTH 800
+#define SCREEN_HEIGHT 600
+/* Track dimensions */
+#define TRACK_WIDTH 500
+#define TRACK_HEIGHT 500
+/* Track position */
+#define TRACK_X1 0
+#define TRACK_Y1 0
+#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
+#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
+#define CMD_WIDTH TRACK_WIDTH
+#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
+
+// JetControl
+
+#include "kernel/func.h"
+#include "drivers/glib.h"
+
+/* useful colors... */
+int white;
+int black;
+int red;
+int lightgray;
+
+TASK jetdummy_task(void *arg)
+{
+ TIME now_dummy, last_dummy, diff_dummy, slice;
+ struct timespec now, last, diff;
+ int x = 0;
+ int height;
+
+ NULL_TIMESPEC(&last);
+ last_dummy = 0;
+ for (;;) {
+ task_nopreempt();
+ jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
+ sys_gettime(&now);
+ task_preempt();
+
+ SUBTIMESPEC(&now, &last, &diff);
+ slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
+ diff_dummy = now_dummy - last_dummy;
+
+ height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
+
+ TIMESPEC_ASSIGN(&last, &now);
+ last_dummy = now_dummy;
+
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
+ JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
+ JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
+ grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
+ JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
+
+ x = (x+1)%JET_DUMMY_WIDTH;
+
+ task_endcycle();
+ }
+}
+
+void init_jetcontrol(void)
+{
+ SOFT_TASK_MODEL m4;
+
+ PID p4;
+
+ /* useful colors ... */
+ white = rgb16(255,255,255);
+ black = rgb16(0,0,0);
+ red = rgb16(255,0,0);
+ lightgray = rgb16(128,128,128);
+
+ /* scenario */
+ grx_text("System load",
+ JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
+ grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
+ JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
+
+ grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
+ grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
+
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
+
+ /* jetdummy task */
+ soft_task_default_model(m4);
+ soft_task_def_period(m4, PERIOD_JETDUMMY);
+ soft_task_def_met(m4, WCET_JETDUMMY);
+ soft_task_def_usemath(m4);
+ p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
+ if (p4 == -1) {
+ grx_close();
+ perror("Could not create task <jetdummy>");
+ sys_end();
+ }
+ task_activate(p4);
+}
+
Index: branches/pj/mpeg2/config.h
===================================================================
--- branches/pj/mpeg2/config.h (nonexistent)
+++ branches/pj/mpeg2/config.h (revision 1085)
@@ -0,0 +1,45 @@
+/* config.h, configuration defines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+/* define NON_ANSI_COMPILER for compilers without function prototyping */
+/* #define NON_ANSI_COMPILER */
+
+#ifdef NON_ANSI_COMPILER
+#define _ANSI_ARGS_(x) ()
+#else
+#define _ANSI_ARGS_(x) x
+#endif
+
+#define RB "rb"
+#define WB "wb"
+
+#ifndef O_BINARY
+#define O_BINARY 0
+
+#endif
Index: branches/pj/mpeg2/getpic.c
===================================================================
--- branches/pj/mpeg2/getpic.c (nonexistent)
+++ branches/pj/mpeg2/getpic.c (revision 1085)
@@ -0,0 +1,1225 @@
+/* getpic.c, picture decoding */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+
+/* private prototypes*/
+static void picture_data _ANSI_ARGS_((int framenum));
+static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
+ int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
+ int *pmvscale, int *pdct_type));
+static void Clear_Block _ANSI_ARGS_((int comp));
+static void Sum_Block _ANSI_ARGS_((int comp));
+static void Saturate _ANSI_ARGS_((short *bp));
+static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
+ int dct_type, int addflag));
+static void Update_Picture_Buffers _ANSI_ARGS_((void));
+static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
+ int sequence_framenum));
+static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
+ int MBA, int MBAmax, int *dct_type));
+
+static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
+ int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
+ int dmvector[2], int stwtype, int dct_type));
+
+static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
+ int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
+ int *stwtype, int *macroblock_type));
+
+static int slice _ANSI_ARGS_((int framenum, int MBAmax));
+
+static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
+ int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
+
+static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
+ int *stwtype, int *stwclass, int *motion_type, int *dct_type,
+ int PMV[2][2][2], int dc_dct_pred[3],
+ int motion_vertical_field_select[2][2], int dmvector[2]));
+
+
+/* decode one frame or field picture */
+void Decode_Picture(bitstream_framenum, sequence_framenum)
+int bitstream_framenum, sequence_framenum;
+{
+
+ if (picture_structure==FRAME_PICTURE && Second_Field)
+ {
+ /* recover from illegal number of field pictures */
+ printf("odd number of field pictures\n");
+ Second_Field = 0;
+ }
+
+ /* IMPLEMENTATION: update picture buffer pointers */
+ Update_Picture_Buffers();
+
+#ifdef VERIFY
+ Check_Headers(bitstream_framenum, sequence_framenum);
+#endif /* VERIFY */
+
+ /* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
+ /* (section number based on November 1995 (Dallas) draft of the
+ conformance document) */
+ if(Ersatz_Flag)
+ Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
+
+ /* form spatial scalable picture */
+
+ /* form spatial scalable picture */
+ /* ISO/IEC 13818-2 section 7.7: Spatial scalability */
+ if (base.pict_scal && !Second_Field)
+ {
+ Spatial_Prediction();
+ }
+
+ /* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
+ picture_data(bitstream_framenum);
+
+ /* write or display current or previously decoded reference frame */
+ /* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
+ frame_reorder(bitstream_framenum, sequence_framenum);
+
+ if (picture_structure!=FRAME_PICTURE)
+ Second_Field = !Second_Field;
+}
+
+
+/* decode all macroblocks of the current picture */
+/* stages described in ISO/IEC 13818-2 section 7 */
+static void picture_data(framenum)
+int framenum;
+{
+ int MBAmax;
+ int ret;
+
+ /* number of macroblocks per picture */
+ MBAmax = mb_width*mb_height;
+
+ if (picture_structure!=FRAME_PICTURE)
+ MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
+
+ for(;;)
+ {
+ if((ret=slice(framenum, MBAmax))<0)
+ return;
+ }
+
+}
+
+
+
+/* decode all macroblocks of the current picture */
+/* ISO/IEC 13818-2 section 6.3.16 */
+static int slice(framenum, MBAmax)
+int framenum, MBAmax;
+{
+ int MBA;
+ int MBAinc, macroblock_type, motion_type, dct_type;
+ int dc_dct_pred[3];
+ int PMV[2][2][2], motion_vertical_field_select[2][2];
+ int dmvector[2];
+ int stwtype, stwclass;
+ int SNRMBA, SNRMBAinc;
+ int ret;
+
+ MBA = 0; /* macroblock address */
+ MBAinc = 0;
+
+ if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
+ return(ret);
+
+ if (Two_Streams && enhan.scalable_mode==SC_SNR)
+ {
+ SNRMBA=0;
+ SNRMBAinc=0;
+ }
+
+ Fault_Flag=0;
+
+ for (;;)
+ {
+
+ /* this is how we properly exit out of picture */
+ if (MBA>=MBAmax)
+ return(-1); /* all macroblocks decoded */
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("frame %d, MB %d\n",framenum,MBA);
+#endif /* TRACE */
+
+#ifdef DISPLAY
+ if (!progressive_frame && picture_structure==FRAME_PICTURE
+ && MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
+ && !Display_Progressive_Flag)
+ {
+ Display_Second_Field();
+ }
+#endif
+
+ ld = &base;
+
+ if (MBAinc==0)
+ {
+ if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
+ ld = &enhan;
+
+ if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
+ {
+resync: /* if Fault_Flag: resynchronize to next next_start_code */
+ Fault_Flag = 0;
+ return(0); /* trigger: go to next slice */
+ }
+ else /* neither next_start_code nor Fault_Flag */
+ {
+ if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
+ ld = &enhan;
+
+ /* decode macroblock address increment */
+ MBAinc = Get_macroblock_address_increment();
+
+ if (Fault_Flag) goto resync;
+ }
+ }
+
+ if (MBA>=MBAmax)
+ {
+ /* MBAinc points beyond picture dimensions */
+ if (!Quiet_Flag)
+ printf("Too many macroblocks in picture\n");
+ return(-1);
+ }
+
+ if (MBAinc==1) /* not skipped */
+ {
+ ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
+ &motion_type, &dct_type, PMV, dc_dct_pred,
+ motion_vertical_field_select, dmvector);
+
+ if(ret==-1)
+ return(-1);
+
+ if(ret==0)
+ goto resync;
+
+ }
+ else /* MBAinc!=1: skipped macroblock */
+ {
+ /* ISO/IEC 13818-2 section 7.6.6 */
+ skipped_macroblock(dc_dct_pred, PMV, &motion_type,
+ motion_vertical_field_select, &stwtype, &macroblock_type);
+ }
+
+ /* SCALABILITY: SNR */
+ /* ISO/IEC 13818-2 section 7.8 */
+ /* NOTE: we currently ignore faults encountered in this routine */
+ if (Two_Streams && enhan.scalable_mode==SC_SNR)
+ Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
+
+ /* ISO/IEC 13818-2 section 7.6 */
+ motion_compensation(MBA, macroblock_type, motion_type, PMV,
+ motion_vertical_field_select, dmvector, stwtype, dct_type);
+
+
+ /* advance to next macroblock */
+ MBA++;
+ MBAinc--;
+
+ /* SCALABILITY: SNR */
+ if (Two_Streams && enhan.scalable_mode==SC_SNR)
+ {
+ SNRMBA++;
+ SNRMBAinc--;
+ }
+
+ if (MBA>=MBAmax)
+ return(-1); /* all macroblocks decoded */
+ }
+}
+
+
+/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
+static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
+ pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
+ int *pmacroblock_type, *pstwtype, *pstwclass;
+ int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
+ int *pdct_type;
+{
+ int macroblock_type;
+ int stwtype, stwcode, stwclass;
+ int motion_type = 0;
+ int motion_vector_count, mv_format, dmv, mvscale;
+ int dct_type;
+ static unsigned char stwc_table[3][4]
+ = { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
+ static unsigned char stwclass_table[9]
+ = {0, 1, 2, 1, 1, 2, 3, 3, 4};
+
+ /* get macroblock_type */
+ macroblock_type = Get_macroblock_type();
+
+ if (Fault_Flag) return;
+
+ /* get spatial_temporal_weight_code */
+ if (macroblock_type & MB_WEIGHT)
+ {
+ if (spatial_temporal_weight_code_table_index==0)
+ stwtype = 4;
+ else
+ {
+ stwcode = Get_Bits(2);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("spatial_temporal_weight_code (");
+ Print_Bits(stwcode,2,2);
+ printf("): %d\n",stwcode);
+ }
+#endif /* TRACE */
+ stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
+ }
+ }
+ else
+ stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
+
+ /* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
+ stwclass = stwclass_table[stwtype];
+
+ /* get frame/field motion type */
+ if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
+ {
+ if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
+ {
+ motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
+#ifdef TRACE
+ if (!frame_pred_frame_dct && Trace_Flag)
+ {
+ printf("frame_motion_type (");
+ Print_Bits(motion_type,2,2);
+ printf("): %s\n",motion_type==MC_FIELD?"Field":
+ motion_type==MC_FRAME?"Frame":
+ motion_type==MC_DMV?"Dual_Prime":"Invalid");
+ }
+#endif /* TRACE */
+ }
+ else /* field_motion_type */
+ {
+ motion_type = Get_Bits(2);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("field_motion_type (");
+ Print_Bits(motion_type,2,2);
+ printf("): %s\n",motion_type==MC_FIELD?"Field":
+ motion_type==MC_16X8?"16x8 MC":
+ motion_type==MC_DMV?"Dual_Prime":"Invalid");
+ }
+#endif /* TRACE */
+ }
+ }
+ else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
+ {
+ /* concealment motion vectors */
+ motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
+ }
+#if 0
+ else
+ {
+ printf("maroblock_modes(): unknown macroblock type\n");
+ motion_type = -1;
+ }
+#endif
+
+ /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
+ if (picture_structure==FRAME_PICTURE)
+ {
+ motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
+ mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
+ }
+ else
+ {
+ motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
+ mv_format = MV_FIELD;
+ }
+
+ dmv = (motion_type==MC_DMV); /* dual prime */
+
+ /* field mv predictions in frame pictures have to be scaled
+ * ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
+ * IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
+ * it displaces the stage:
+ *
+ * if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
+ * prediction = PMV[r][s][t] DIV 2;
+ */
+
+ mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
+
+ /* get dct_type (frame DCT / field DCT) */
+ dct_type = (picture_structure==FRAME_PICTURE)
+ && (!frame_pred_frame_dct)
+ && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
+ ? Get_Bits(1)
+ : 0;
+
+#ifdef TRACE
+ if (Trace_Flag && (picture_structure==FRAME_PICTURE)
+ && (!frame_pred_frame_dct)
+ && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
+ printf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
+#endif /* TRACE */
+
+ /* return values */
+ *pmacroblock_type = macroblock_type;
+ *pstwtype = stwtype;
+ *pstwclass = stwclass;
+ *pmotion_type = motion_type;
+ *pmotion_vector_count = motion_vector_count;
+ *pmv_format = mv_format;
+ *pdmv = dmv;
+ *pmvscale = mvscale;
+ *pdct_type = dct_type;
+}
+
+
+/* move/add 8x8-Block from block[comp] to backward_reference_frame */
+/* copy reconstructed 8x8 block from block[comp] to current_frame[]
+ * ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
+ * This stage also embodies some of the operations implied by:
+ * - ISO/IEC 13818-2 section 7.6.7: Combining predictions
+ * - ISO/IEC 13818-2 section 6.1.3: Macroblock
+*/
+static void Add_Block(comp,bx,by,dct_type,addflag)
+int comp,bx,by,dct_type,addflag;
+{
+ int cc,i, j, iincr;
+ unsigned char *rfp;
+ short *bp;
+
+
+ /* derive color component index */
+ /* equivalent to ISO/IEC 13818-2 Table 7-1 */
+ cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
+
+ if (cc==0)
+ {
+ /* luminance */
+
+ if (picture_structure==FRAME_PICTURE)
+ if (dct_type)
+ {
+ /* field DCT coding */
+ rfp = current_frame[0]
+ + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
+ iincr = (Coded_Picture_Width<<1) - 8;
+ }
+ else
+ {
+ /* frame DCT coding */
+ rfp = current_frame[0]
+ + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
+ iincr = Coded_Picture_Width - 8;
+ }
+ else
+ {
+ /* field picture */
+ rfp = current_frame[0]
+ + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
+ iincr = (Coded_Picture_Width<<1) - 8;
+ }
+ }
+ else
+ {
+ /* chrominance */
+
+ /* scale coordinates */
+ if (chroma_format!=CHROMA444)
+ bx >>= 1;
+ if (chroma_format==CHROMA420)
+ by >>= 1;
+ if (picture_structure==FRAME_PICTURE)
+ {
+ if (dct_type && (chroma_format!=CHROMA420))
+ {
+ /* field DCT coding */
+ rfp = current_frame[cc]
+ + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
+ iincr = (Chroma_Width<<1) - 8;
+ }
+ else
+ {
+ /* frame DCT coding */
+ rfp = current_frame[cc]
+ + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
+ iincr = Chroma_Width - 8;
+ }
+ }
+ else
+ {
+ /* field picture */
+ rfp = current_frame[cc]
+ + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
+ iincr = (Chroma_Width<<1) - 8;
+ }
+ }
+
+ bp = ld->block[comp];
+
+ if (addflag)
+ {
+ for (i=0; i<8; i++)
+ {
+ for (j=0; j<8; j++)
+ {
+ *rfp = Clip[*bp++ + *rfp];
+ rfp++;
+ }
+
+ rfp+= iincr;
+ }
+ }
+ else
+ {
+ for (i=0; i<8; i++)
+ {
+ for (j=0; j<8; j++)
+ *rfp++ = Clip[*bp++ + 128];
+
+ rfp+= iincr;
+ }
+ }
+}
+
+
+/* ISO/IEC 13818-2 section 7.8 */
+static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
+ int *SNRMBA, *SNRMBAinc;
+ int MBA, MBAmax;
+ int *dct_type;
+{
+ int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
+ int slice_vert_pos_ext, quantizer_scale_code, comp, code;
+
+ ld = &enhan;
+
+ if (*SNRMBAinc==0)
+ {
+ if (!Show_Bits(23)) /* next_start_code */
+ {
+ next_start_code();
+ code = Show_Bits(32);
+
+ if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
+ {
+ /* only slice headers are allowed in picture_data */
+ if (!Quiet_Flag)
+ printf("SNR: Premature end of picture\n");
+ return;
+ }
+
+ Flush_Buffer32();
+
+ /* decode slice header (may change quantizer_scale) */
+ slice_vert_pos_ext = slice_header();
+
+ /* decode macroblock address increment */
+ *SNRMBAinc = Get_macroblock_address_increment();
+
+ /* set current location */
+ *SNRMBA =
+ ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
+
+ *SNRMBAinc = 1; /* first macroblock in slice: not skipped */
+ }
+ else /* not next_start_code */
+ {
+ if (*SNRMBA>=MBAmax)
+ {
+ if (!Quiet_Flag)
+ printf("Too many macroblocks in picture\n");
+ return;
+ }
+
+ /* decode macroblock address increment */
+ *SNRMBAinc = Get_macroblock_address_increment();
+ }
+ }
+
+ if (*SNRMBA!=MBA)
+ {
+ /* streams out of sync */
+ if (!Quiet_Flag)
+ printf("Cant't synchronize streams\n");
+ return;
+ }
+
+ if (*SNRMBAinc==1) /* not skipped */
+ {
+ macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
+ &dummy, &dummy, &dummy, &dummy, &dummy,
+ &SNRdct_type);
+
+ if (SNRmacroblock_type & MACROBLOCK_PATTERN)
+ *dct_type = SNRdct_type;
+
+ if (SNRmacroblock_type & MACROBLOCK_QUANT)
+ {
+ quantizer_scale_code = Get_Bits(5);
+ ld->quantizer_scale =
+ ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
+ }
+
+ /* macroblock_pattern */
+ if (SNRmacroblock_type & MACROBLOCK_PATTERN)
+ {
+ SNRcoded_block_pattern = Get_coded_block_pattern();
+
+ if (chroma_format==CHROMA422)
+ SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
+ else if (chroma_format==CHROMA444)
+ SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
+ }
+ else
+ SNRcoded_block_pattern = 0;
+
+ /* decode blocks */
+ for (comp=0; comp<block_count; comp++)
+ {
+ Clear_Block(comp);
+
+ if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
+ Decode_MPEG2_Non_Intra_Block(comp);
+ }
+ }
+ else /* SNRMBAinc!=1: skipped macroblock */
+ {
+ for (comp=0; comp<block_count; comp++)
+ Clear_Block(comp);
+ }
+
+ ld = &base;
+}
+
+
+
+/* IMPLEMENTATION: set scratch pad macroblock to zero */
+static void Clear_Block(comp)
+int comp;
+{
+ short *Block_Ptr;
+ int i;
+
+ Block_Ptr = ld->block[comp];
+
+ for (i=0; i<64; i++)
+ *Block_Ptr++ = 0;
+}
+
+
+/* SCALABILITY: add SNR enhancement layer block data to base layer */
+/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
+static void Sum_Block(comp)
+int comp;
+{
+ short *Block_Ptr1, *Block_Ptr2;
+ int i;
+
+ Block_Ptr1 = base.block[comp];
+ Block_Ptr2 = enhan.block[comp];
+
+ for (i=0; i<64; i++)
+ *Block_Ptr1++ += *Block_Ptr2++;
+}
+
+
+/* limit coefficients to -2048..2047 */
+/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
+static void Saturate(Block_Ptr)
+short *Block_Ptr;
+{
+ int i, sum, val;
+
+ sum = 0;
+
+ /* ISO/IEC 13818-2 section 7.4.3: Saturation */
+ for (i=0; i<64; i++)
+ {
+ val = Block_Ptr[i];
+
+ if (val>2047)
+ val = 2047;
+ else if (val<-2048)
+ val = -2048;
+
+ Block_Ptr[i] = val;
+ sum+= val;
+ }
+
+ /* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
+ if ((sum&1)==0)
+ Block_Ptr[63]^= 1;
+
+}
+
+
+/* reuse old picture buffers as soon as they are no longer needed
+ based on life-time axioms of MPEG */
+static void Update_Picture_Buffers()
+{
+ int cc; /* color component index */
+ unsigned char *tmp; /* temporary swap pointer */
+
+ for (cc=0; cc<3; cc++)
+ {
+ /* B pictures do not need to be save for future reference */
+ if (picture_coding_type==B_TYPE)
+ {
+ current_frame[cc] = auxframe[cc];
+ }
+ else
+ {
+ /* only update at the beginning of the coded frame */
+ if (!Second_Field)
+ {
+ tmp = forward_reference_frame[cc];
+
+ /* the previously decoded reference frame is stored
+ coincident with the location where the backward
+ reference frame is stored (backwards prediction is not
+ needed in P pictures) */
+ forward_reference_frame[cc] = backward_reference_frame[cc];
+
+ /* update pointer for potential future B pictures */
+ backward_reference_frame[cc] = tmp;
+ }
+
+ /* can erase over old backward reference frame since it is not used
+ in a P picture, and since any subsequent B pictures will use the
+ previously decoded I or P frame as the backward_reference_frame */
+ current_frame[cc] = backward_reference_frame[cc];
+ }
+
+ /* IMPLEMENTATION:
+ one-time folding of a line offset into the pointer which stores the
+ memory address of the current frame saves offsets and conditional
+ branches throughout the remainder of the picture processing loop */
+ if (picture_structure==BOTTOM_FIELD)
+ current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
+ }
+}
+
+
+/* store last frame */
+
+void Output_Last_Frame_of_Sequence(Framenum)
+int Framenum;
+{
+ if (Second_Field)
+ printf("last frame incomplete, not stored\n");
+ else
+ Write_Frame(backward_reference_frame,Framenum-1);
+}
+
+
+
+static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
+int Bitstream_Framenum, Sequence_Framenum;
+{
+ /* tracking variables to insure proper output in spatial scalability */
+ static int Oldref_progressive_frame, Newref_progressive_frame;
+
+ if (Sequence_Framenum!=0)
+ {
+ if (picture_structure==FRAME_PICTURE || Second_Field)
+ {
+ if (picture_coding_type==B_TYPE)
+ Write_Frame(auxframe,Bitstream_Framenum-1);
+ else
+ {
+ Newref_progressive_frame = progressive_frame;
+ progressive_frame = Oldref_progressive_frame;
+
+ Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
+
+ Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
+ }
+ }
+#ifdef DISPLAY
+ else if (Output_Type==T_X11)
+ {
+ if(!Display_Progressive_Flag)
+ Display_Second_Field();
+ }
+#endif
+ }
+ else
+ Oldref_progressive_frame = progressive_frame;
+
+}
+
+
+/* ISO/IEC 13818-2 section 7.6 */
+static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
+ motion_vertical_field_select, dmvector, stwtype, dct_type)
+int MBA;
+int macroblock_type;
+int motion_type;
+int PMV[2][2][2];
+int motion_vertical_field_select[2][2];
+int dmvector[2];
+int stwtype;
+int dct_type;
+{
+ int bx, by;
+ int comp;
+
+ /* derive current macroblock position within picture */
+ /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
+ bx = 16*(MBA%mb_width);
+ by = 16*(MBA/mb_width);
+
+ /* motion compensation */
+ if (!(macroblock_type & MACROBLOCK_INTRA))
+ form_predictions(bx,by,macroblock_type,motion_type,PMV,
+ motion_vertical_field_select,dmvector,stwtype);
+
+ /* SCALABILITY: Data Partitioning */
+ if (base.scalable_mode==SC_DP)
+ ld = &base;
+
+ /* copy or add block data into picture */
+ for (comp=0; comp<block_count; comp++)
+ {
+ /* SCALABILITY: SNR */
+ /* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
+ the two a layers */
+ if (Two_Streams && enhan.scalable_mode==SC_SNR)
+ Sum_Block(comp); /* add SNR enhancement layer data to base layer */
+
+ /* MPEG-2 saturation and mismatch control */
+ /* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
+ /* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
+ if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
+ Saturate(ld->block[comp]);
+
+ /* ISO/IEC 13818-2 section Annex A: inverse DCT */
+ if (Reference_IDCT_Flag)
+ Reference_IDCT(ld->block[comp]);
+ else
+ Fast_IDCT(ld->block[comp]);
+
+ /* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
+ Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
+ }
+
+}
+
+
+
+/* ISO/IEC 13818-2 section 7.6.6 */
+static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
+ motion_vertical_field_select, stwtype, macroblock_type)
+int dc_dct_pred[3];
+int PMV[2][2][2];
+int *motion_type;
+int motion_vertical_field_select[2][2];
+int *stwtype;
+int *macroblock_type;
+{
+ int comp;
+
+ /* SCALABILITY: Data Paritioning */
+ if (base.scalable_mode==SC_DP)
+ ld = &base;
+
+ for (comp=0; comp<block_count; comp++)
+ Clear_Block(comp);
+
+ /* reset intra_dc predictors */
+ /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
+ dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
+
+ /* reset motion vector predictors */
+ /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
+ if (picture_coding_type==P_TYPE)
+ PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
+
+ /* derive motion_type */
+ if (picture_structure==FRAME_PICTURE)
+ *motion_type = MC_FRAME;
+ else
+ {
+ *motion_type = MC_FIELD;
+
+ /* predict from field of same parity */
+ /* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
+ picture */
+ motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
+ (picture_structure==BOTTOM_FIELD);
+ }
+
+ /* skipped I are spatial-only predicted, */
+ /* skipped P and B are temporal-only predicted */
+ /* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
+ *stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
+
+ /* IMPLEMENTATION: clear MACROBLOCK_INTRA */
+ *macroblock_type&= ~MACROBLOCK_INTRA;
+
+}
+
+
+/* return==-1 means go to next picture */
+/* the expression "start of slice" is used throughout the normative
+ body of the MPEG specification */
+static int start_of_slice(MBAmax, MBA, MBAinc,
+ dc_dct_pred, PMV)
+int MBAmax;
+int *MBA;
+int *MBAinc;
+int dc_dct_pred[3];
+int PMV[2][2][2];
+{
+ unsigned int code;
+ int slice_vert_pos_ext;
+
+ ld = &base;
+
+ Fault_Flag = 0;
+
+ next_start_code();
+ code = Show_Bits(32);
+
+ if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
+ {
+ /* only slice headers are allowed in picture_data */
+ if (!Quiet_Flag)
+ printf("start_of_slice(): Premature end of picture\n");
+
+ return(-1); /* trigger: go to next picture */
+ }
+
+ Flush_Buffer32();
+
+ /* decode slice header (may change quantizer_scale) */
+ slice_vert_pos_ext = slice_header();
+
+
+ /* SCALABILITY: Data Partitioning */
+ if (base.scalable_mode==SC_DP)
+ {
+ ld = &enhan;
+ next_start_code();
+ code = Show_Bits(32);
+
+ if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
+ {
+ /* only slice headers are allowed in picture_data */
+ if (!Quiet_Flag)
+ printf("DP: Premature end of picture\n");
+ return(-1); /* trigger: go to next picture */
+ }
+
+ Flush_Buffer32();
+
+ /* decode slice header (may change quantizer_scale) */
+ slice_vert_pos_ext = slice_header();
+
+ if (base.priority_breakpoint!=1)
+ ld = &base;
+ }
+
+ /* decode macroblock address increment */
+ *MBAinc = Get_macroblock_address_increment();
+
+ if (Fault_Flag)
+ {
+ printf("start_of_slice(): MBAinc unsuccessful\n");
+ return(0); /* trigger: go to next slice */
+ }
+
+ /* set current location */
+ /* NOTE: the arithmetic used to derive macroblock_address below is
+ * equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
+ */
+ *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
+ *MBAinc = 1; /* first macroblock in slice: not skipped */
+
+ /* reset all DC coefficient and motion vector predictors */
+ /* reset all DC coefficient and motion vector predictors */
+ /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
+ dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
+
+ /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
+ PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
+ PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
+
+ /* successfull: trigger decode macroblocks in slice */
+ return(1);
+}
+
+
+/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
+static int decode_macroblock(macroblock_type, stwtype, stwclass,
+ motion_type, dct_type, PMV, dc_dct_pred,
+ motion_vertical_field_select, dmvector)
+int *macroblock_type;
+int *stwtype;
+int *stwclass;
+int *motion_type;
+int *dct_type;
+int PMV[2][2][2];
+int dc_dct_pred[3];
+int motion_vertical_field_select[2][2];
+int dmvector[2];
+{
+ /* locals */
+ int quantizer_scale_code;
+ int comp;
+
+ int motion_vector_count;
+ int mv_format;
+ int dmv;
+ int mvscale;
+ int coded_block_pattern;
+
+ /* SCALABILITY: Data Patitioning */
+ if (base.scalable_mode==SC_DP)
+ {
+ if (base.priority_breakpoint<=2)
+ ld = &enhan;
+ else
+ ld = &base;
+ }
+
+ /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
+ macroblock_modes(macroblock_type, stwtype, stwclass,
+ motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
+ dct_type);
+
+ if (Fault_Flag) return(0); /* trigger: go to next slice */
+
+ if (*macroblock_type & MACROBLOCK_QUANT)
+ {
+ quantizer_scale_code = Get_Bits(5);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("quantiser_scale_code (");
+ Print_Bits(quantizer_scale_code,5,5);
+ printf("): %d\n",quantizer_scale_code);
+ }
+#endif /* TRACE */
+
+ /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
+ if (ld->MPEG2_Flag)
+ ld->quantizer_scale =
+ ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
+ : (quantizer_scale_code << 1);
+ else
+ ld->quantizer_scale = quantizer_scale_code;
+
+ /* SCALABILITY: Data Partitioning */
+ if (base.scalable_mode==SC_DP)
+ /* make sure base.quantizer_scale is valid */
+ base.quantizer_scale = ld->quantizer_scale;
+ }
+
+ /* motion vectors */
+
+
+ /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
+
+ /* decode forward motion vectors */
+ if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
+ || ((*macroblock_type & MACROBLOCK_INTRA)
+ && concealment_motion_vectors))
+ {
+ if (ld->MPEG2_Flag)
+ motion_vectors(PMV,dmvector,motion_vertical_field_select,
+ 0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
+ dmv,mvscale);
+ else
+ motion_vector(PMV[0][0],dmvector,
+ forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
+ }
+
+ if (Fault_Flag) return(0); /* trigger: go to next slice */
+
+ /* decode backward motion vectors */
+ if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
+ {
+ if (ld->MPEG2_Flag)
+ motion_vectors(PMV,dmvector,motion_vertical_field_select,
+ 1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
+ mvscale);
+ else
+ motion_vector(PMV[0][1],dmvector,
+ backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
+ }
+
+ if (Fault_Flag) return(0); /* trigger: go to next slice */
+
+ if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
+ Flush_Buffer(1); /* remove marker_bit */
+
+ if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
+ ld = &enhan;
+
+ /* macroblock_pattern */
+ /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
+ if (*macroblock_type & MACROBLOCK_PATTERN)
+ {
+ coded_block_pattern = Get_coded_block_pattern();
+
+ if (chroma_format==CHROMA422)
+ {
+ /* coded_block_pattern_1 */
+ coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("coded_block_pattern_1: ");
+ Print_Bits(coded_block_pattern,2,2);
+ printf(" (%d)\n",coded_block_pattern&3);
+ }
+#endif /* TRACE */
+ }
+ else if (chroma_format==CHROMA444)
+ {
+ /* coded_block_pattern_2 */
+ coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("coded_block_pattern_2: ");
+ Print_Bits(coded_block_pattern,6,6);
+ printf(" (%d)\n",coded_block_pattern&63);
+ }
+#endif /* TRACE */
+ }
+ }
+ else
+ coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
+ (1<<block_count)-1 : 0;
+
+ if (Fault_Flag) return(0); /* trigger: go to next slice */
+
+ /* decode blocks */
+ for (comp=0; comp<block_count; comp++)
+ {
+ /* SCALABILITY: Data Partitioning */
+ if (base.scalable_mode==SC_DP)
+ ld = &base;
+
+ Clear_Block(comp);
+
+ if (coded_block_pattern & (1<<(block_count-1-comp)))
+ {
+ if (*macroblock_type & MACROBLOCK_INTRA)
+ {
+ if (ld->MPEG2_Flag)
+ Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
+ else
+ Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
+ }
+ else
+ {
+ if (ld->MPEG2_Flag)
+ Decode_MPEG2_Non_Intra_Block(comp);
+ else
+ Decode_MPEG1_Non_Intra_Block(comp);
+ }
+
+ if (Fault_Flag) return(0); /* trigger: go to next slice */
+ }
+ }
+
+ if(picture_coding_type==D_TYPE)
+ {
+ /* remove end_of_macroblock (always 1, prevents startcode emulation) */
+ /* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
+ marker_bit("D picture end_of_macroblock bit");
+ }
+
+ /* reset intra_dc predictors */
+ /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
+ if (!(*macroblock_type & MACROBLOCK_INTRA))
+ dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
+
+ /* reset motion vector predictors */
+ if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
+ {
+ /* intra mb without concealment motion vectors */
+ /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
+ PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
+ PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
+ }
+
+ /* special "No_MC" macroblock_type case */
+ /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
+ if ((picture_coding_type==P_TYPE)
+ && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
+ {
+ /* non-intra mb without forward mv in a P picture */
+ /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
+ PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
+
+ /* derive motion_type */
+ /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
+ if (picture_structure==FRAME_PICTURE)
+ *motion_type = MC_FRAME;
+ else
+ {
+ *motion_type = MC_FIELD;
+ /* predict from field of same parity */
+ motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
+ }
+ }
+
+ if (*stwclass==4)
+ {
+ /* purely spatially predicted macroblock */
+ /* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
+ PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
+ PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
+ }
+
+ /* successfully decoded macroblock */
+ return(1);
+
+} /* decode_macroblock */
+
+
Index: branches/pj/mpeg2/spatial.doc
===================================================================
--- branches/pj/mpeg2/spatial.doc (nonexistent)
+++ branches/pj/mpeg2/spatial.doc (revision 1085)
@@ -0,0 +1,154 @@
+The following changes have been made to debug spatial scalability:
+
+gethdr.c
+--------
+
+Temporal_reference is used to compute the frame number of each frame,
+named true_framenum. The periodic reset at each GOP header as well as
+the wrap of temporal_reference at 1024 cause a base value
+temp_ref_base to be incremented accordingly.
+
+spatscal.c
+----------
+
+getspatref()
+
+A potential problem: Variable char fname[32] was dimensioned
+statically and too small.
+
+true_framenum is used instead of lower_layer_temporal_reference to
+determine the lower layer frame to be read for spatial prediction.
+
+The verification of lower_layer_temporal_reference is not possible
+since the temporal reference values that have been encoded into the
+base layer bitstream are not available to the enhancement layer
+decoder.
+
+Since there is no decoder timing information available, the rules on
+which frames can legally be used as spatial prediction frames cannot
+be checked.
+
+Lower layer frames are read field-wise or frame-wise, depending on the
+lower_layer_progressive_frame flag. Consistency between layers is
+checked since the file format for frame and field pictures differs.
+
+Note that the base layer decoder must not use the -f option to enforce
+frame-wise storage.
+
+Note further that only yuv image format (option -o0) is supported as
+input format.
+
+spatpred()
+
+The code for the various combinations of llprog_frame, llfieldsel and
+prog_frame has been completed and verified with the tceh_conf23
+bitstream that uses all permissive combinations.
+
+
+getpic.c
+--------
+
+A small bug when storing an I- or P-frame: The prog_frame flag that
+the decoder knows when storing the oldrefframe belongs to the current
+refframe. Therefore the old value of the flag needs to be memorized.
+
+
+store.c
+-------
+
+A potential problem: the filename variables char outname[32],
+tmpname[32] are statically dimensioned and quite small.
+
+
+The concept of time in this video decoder software
+--------------------------------------------------
+
+When decoding a non-scalable bitstream, the frame number (i.e.
+temporal position) of the current I- or P-frame can be derived
+implicitly from the number of preceding B-frames after they have been
+decoded. Therefore the temporal_reference entry in the picture header
+is somewhat redundant and does not necessarily have to be evaluated in
+the decoding process.
+
+Decoding of the enhancement layer of a spatial scalable hierarchy,
+however, requires to know the temporal position of each frame at the
+instant when it is decoded, since data from a lower layer reference
+frame has to be incorporated.
+
+In the architecture of this video-only decoder decoding of a spatial
+scalable hierarchy of bitstreams is done by calling mpeg2decode once
+for the base layer bitstream and a second time for the enhancement
+layer bitstream, indicating where the decoded base layer frames can be
+found (option -s<filename>).
+
+Here the concept of time is only present in the form of frame numbers.
+Therefore spatial scalable bitstream hierarchies can only be handled
+under the assumption that base and enhancement layer bitstreams are
+decoded to image sequences where corresponding images of both layers
+have identical frame numbers.
+
+More specifically this means that base and enhancement layer
+bitstreams must contain video with the same frame rate. Furthermore
+only the temporally coincident frame of the base layer can be accessed
+for spatial prediction by the enhancement layer decoder, since it is
+not possible to resolve unambiguously the lower_layer_temporal_reference
+which is meant to further specify the lower layer reference frame.
+
+======================== SPATIAL.DOC ========================0
+
+Decoding a spatial scalable hierarchy of bitstreams
+---------------------------------------------------
+
+With this video-only decoder decoding of a spatial scalable hierarchy
+of bitstreams is done by calling mpeg2decode once for the base layer
+bitstream and a second time for the enhancement layer bitstream,
+indicating where the decoded base layer frames can be found
+(using option -s and supplying <spatial base filename>).
+
+mpeg2decode -r -o0 base.mpg base%d%c
+mpeg2decode -r -o0 -f -s base%d%c enh.mpg enh%d
+
+Note that the base layer decoder must not use the -f option to enforce
+frame-wise storage.
+
+Note further that only yuv image format (option -o0) is supported as
+input format.
+
+
+Timing / layer synchronisation in this video decoder software
+-------------------------------------------------------------
+
+When decoding a non-scalable bitstream, the frame number (i.e.
+temporal position) of the current I- or P-frame can be derived
+implicitly from the number of preceding B-frames after they have been
+decoded. Therefore the temporal_reference entry in the picture header
+is somewhat redundant and does not necessarily have to be evaluated in
+the decoding process.
+
+Decoding of the enhancement layer of a spatial scalable hierarchy,
+however, requires to know the temporal position of each frame at the
+instant when it is decoded, since data from a lower layer reference
+frame has to be incorporated.
+
+The concept of time is only present in the form of frame numbers.
+Therefore spatial scalable bitstream hierarchies can only be handled
+under the assumption that base and enhancement layer bitstreams are
+decoded to image sequences where corresponding images of both layers
+have identical frame numbers.
+
+More specifically this means that base and enhancement layer
+bitstreams must contain video with the same frame rate. Furthermore
+only the temporally coincident frame of the base layer can be accessed
+for spatial prediction by the enhancement layer decoder, since it is
+not possible to resolve unambiguously the lower_layer_temporal_reference
+which is meant to further specify the lower layer reference frame.
+
+Lower layer frames are read field-wise or frame-wise, depending on the
+lower_layer_progressive_frame flag. Consistency between layers in this
+respect is checked since the file format for frame and field pictures
+differs.
+
+
+
+
+
Index: branches/pj/mpeg2/idctref.c
===================================================================
--- branches/pj/mpeg2/idctref.c (nonexistent)
+++ branches/pj/mpeg2/idctref.c (revision 1085)
@@ -0,0 +1,108 @@
+/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
+ * direct matrix multiply) Inverse Discrete Cosine Transform
+*/
+
+
+/* Here we use math.h to generate constants. Compiler results may
+ vary a little */
+
+#include <math.h>
+
+#include "config.h"
+
+#ifndef PI
+# ifdef M_PI
+# define PI M_PI
+# else
+# define PI 3.14159265358979323846
+# endif
+#endif
+
+/* global declarations */
+void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
+void Reference_IDCT _ANSI_ARGS_((short *block));
+
+/* private data */
+
+/* cosine transform matrix for 8x1 IDCT */
+static double c[8][8];
+
+/* initialize DCT coefficient matrix */
+
+void Initialize_Reference_IDCT()
+{
+ int freq, time;
+ double scale;
+
+ for (freq=0; freq < 8; freq++)
+ {
+ scale = (freq == 0) ? sqrt(0.125) : 0.5;
+ for (time=0; time<8; time++)
+ c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
+ }
+}
+
+/* perform IDCT matrix multiply for 8x8 coefficient block */
+
+void Reference_IDCT(block)
+short *block;
+{
+ int i, j, k, v;
+ double partial_product;
+ double tmp[64];
+
+ for (i=0; i<8; i++)
+ for (j=0; j<8; j++)
+ {
+ partial_product = 0.0;
+
+ for (k=0; k<8; k++)
+ partial_product+= c[k][j]*block[8*i+k];
+
+ tmp[8*i+j] = partial_product;
+ }
+
+ /* Transpose operation is integrated into address mapping by switching
+ loop order of i and j */
+
+ for (j=0; j<8; j++)
+ for (i=0; i<8; i++)
+ {
+ partial_product = 0.0;
+
+ for (k=0; k<8; k++)
+ partial_product+= c[k][i]*tmp[8*k+j];
+
+ v = (int) floor(partial_product+0.5);
+ block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
+ }
+}
Index: branches/pj/mpeg2/getbits.c
===================================================================
--- branches/pj/mpeg2/getbits.c (nonexistent)
+++ branches/pj/mpeg2/getbits.c (revision 1085)
@@ -0,0 +1,202 @@
+/* getbits.c, bit level routines */
+
+/*
+ * All modifications (mpeg2decode -> mpeg2play) are
+ * Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
+ */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "global.h"
+
+/* initialize buffer, call once before first getbits or showbits */
+
+void Initialize_Buffer()
+{
+ ld->Incnt = 0;
+ ld->Rdptr = ld->Rdbfr + 2048;
+ ld->Rdmax = ld->Rdptr;
+
+#ifdef VERIFY
+ /* only the verifier uses this particular bit counter
+ * Bitcnt keeps track of the current parser position with respect
+ * to the video elementary stream being decoded, regardless
+ * of whether or not it is wrapped within a systems layer stream
+ */
+ ld->Bitcnt = 0;
+#endif
+
+ ld->Bfr = 0;
+ Flush_Buffer(0); /* fills valid data into bfr */
+}
+
+void Fill_Buffer()
+{
+ int Buffer_Level;
+
+ Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
+ ld->Rdptr = ld->Rdbfr;
+
+ if (System_Stream_Flag)
+ ld->Rdmax -= 2048;
+
+
+ /* end of the bitstream file */
+ if (Buffer_Level < 2048)
+ {
+ /* just to be safe */
+ if (Buffer_Level < 0)
+ Buffer_Level = 0;
+
+ /* pad until the next to the next 32-bit word boundary */
+ while (Buffer_Level & 3)
+ ld->Rdbfr[Buffer_Level++] = 0;
+
+ /* pad the buffer with sequence end codes */
+ while (Buffer_Level < 2048)
+ {
+ ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
+ ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
+ ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
+ ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
+ }
+ }
+}
+
+
+/* MPEG-1 system layer demultiplexer */
+
+int Get_Byte()
+{
+ while(ld->Rdptr >= ld->Rdbfr+2048)
+ {
+ read(ld->Infile,ld->Rdbfr,2048);
+ ld->Rdptr -= 2048;
+ ld->Rdmax -= 2048;
+ }
+ return *ld->Rdptr++;
+}
+
+/* extract a 16-bit word from the bitstream buffer */
+int Get_Word()
+{
+ int Val;
+
+ Val = Get_Byte();
+ return (Val<<8) | Get_Byte();
+}
+
+
+/* return next n bits (right adjusted) without advancing */
+
+unsigned int Show_Bits(N)
+int N;
+{
+ return ld->Bfr >> (32-N);
+}
+
+
+/* return next bit (could be made faster than Get_Bits(1)) */
+
+unsigned int Get_Bits1()
+{
+ return Get_Bits(1);
+}
+
+
+/* advance by n bits */
+
+void Flush_Buffer(N)
+int N;
+{
+ int Incnt;
+
+ ld->Bfr <<= N;
+
+ Incnt = ld->Incnt -= N;
+
+ if (Incnt <= 24)
+ {
+ if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
+ {
+ do
+ {
+ if (ld->Rdptr >= ld->Rdmax)
+ Next_Packet();
+ ld->Bfr |= Get_Byte() << (24 - Incnt);
+ Incnt += 8;
+ }
+ while (Incnt <= 24);
+ }
+ else if (ld->Rdptr < ld->Rdbfr+2044)
+ {
+ do
+ {
+ ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
+ Incnt += 8;
+ }
+ while (Incnt <= 24);
+ }
+ else
+ {
+ do
+ {
+ if (ld->Rdptr >= ld->Rdbfr+2048)
+ Fill_Buffer();
+ ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
+ Incnt += 8;
+ }
+ while (Incnt <= 24);
+ }
+ ld->Incnt = Incnt;
+ }
+
+#ifdef VERIFY
+ ld->Bitcnt += N;
+#endif /* VERIFY */
+
+}
+
+
+/* return next n bits (right adjusted) */
+
+unsigned int Get_Bits(N)
+int N;
+{
+ unsigned int Val;
+
+ Val = Show_Bits(N);
+ Flush_Buffer(N);
+
+ return Val;
+}
+
Index: branches/pj/mpeg2/test.m2v
===================================================================
--- branches/pj/mpeg2/test.m2v (nonexistent)
+++ branches/pj/mpeg2/test.m2v (revision 1085)
@@ -0,0 +1,73 @@
+³€#ú 0µ‚µ#²MPEG-2 Verification Sequence
+¸_¿l@
+XXµÿ÷ÌSÐTñç!H <$¶óJÒˆ4*”¿FóJ“ a$°ó›Ñ*“Ò@ҔøPUño“=¾œæñ©^„Û!g"¥ý*¶óÔ¾¥qc֗ZµZ•#XN,r0§X°`Pã¥m+fÝÒIgz´â‚ ò$¶¤/°$¨…ZXʶJ_£s&î•öÕR䨫¡#›H¨l!-…BÌA„–l›Ãipb³Õ’gƒqòGY/‚¢–F +Öߧâȧ@¥EJ_‹s6WKXT%• æÐöý$Lµ}iÑG•Â×Çi”@Bí-»’e´aà?{reLRÃùí–D7!GidÞ+fJ–€E +4ãQ#l&ØP8{iªì˳Õ*@«NÅZ؞UȲ©d‹iQ±­Ñ V÷<?'‰Ð¿Š\lU%’À-) ªUk­KèLC a°ä&¶‹t < AMm-¬ÃM!,P“ɨ­n¡0*ùC‚À‰YVìR‚Š<ó&ÁVÄ.SÂÀûfɀS՚’!£éç!Gs²–ÖR£ÍÚCXáÔæó©UÒÏA瞣ì)»‹¶ê 
+8£Ûä[ê©MëÙ@ªù-ƒaV*µ§¬ …H¡v*žÕÈ°øð9BcfÙdž©R’ŽC›VͶŸŒuV?2K<Û
+À†¾~ò&ª]¡á§ +;Á¹4¸ˆ3?ÂCècu uæÈ`äˆ3Ðaþ-q¥»?Pº:ÛJ.Áð9¹q0ØC§àсU!Tmҗ©OæÅ K¡ØxôR¶ +môxAÈóõ
+ƒÛ›»6C6„(h cÙ Ë ¯ü£hb—|—×Ԑ5‡´7Ñ*y­AÕ–ƒÐåD2µ»M±< ‹áæ2cjÍÞ"ÚJ$”ï؇P¹@ó”åhÛ­ãËf–\Bèß ¦ì\*—e¨PXW†·SgžU4Þ6Ä:D€5­íy… ™ÂÚ6’èÈTnº[Djo˜ùÁnæÎ+½Ý©J&¨ÂgídXPæôÿzñ'ÚoÒ¾EI
+––dßJُ}ÙÜR]­ëVhé$ƒ[©[ˆs2¦ÍÉf.ÑäʉT–Är­m2š²Ñò­µhm +
+³VCÀy$0±¤Ú¥y¡AL»%ô°aGB‚t¶ù1£›ê›¼š”àD!BÔ`ÚXbÙ `B©ò7J¿Ö⏔>éÔl7e£(û
+-B)ZÉ¡¾|¦"C)VŒ’–×Í´ŸI°àúQvTwƒU-S€!–Å8ó‹ÔXÊè·JÈ6T£%C‚!t±ìÕ©»2REñP¢´¶× +æ鷺¨²TP&FÁ2¸`JÑ£|Cɍ×v)r(Ö
+µ«Á†ãï–q
+Ÿý’(¦B’*µO~pN6¥Sà~PIg52dJŠ NÊzԚ +“l1Ş•e°„ƒ&TñfZ6U½«ä]–)~0 Â–0{u¹~ ÌY¹®´¥ˆR­£´ì°õãiсá­ôÞQú2c¤nŠ[kµ+ö‚ö•3:ÉTÒ¬Ø9[Fiɱ¼x«x²“g{?rŽÊ¤ÊÛÆƇÈßmÀ„iód(Ÿl×K¶îðxÄØ=C-¾n)sf»žÔ­¶ÙžYfð0õ¥6ñKöAÑÕ¬öÛJPÀÖ*¢¹†× …,@ëY—œž€IˆxJ Ød¡ ±_%ð“ 4¹˄óNX;å‹|ƒ}p1ÿûzÕNô,¡ƒ)ê}j +ƒŠROŽ6šZJZ]¡'ÐÚ
+kc’¡jpÑÅ&²l›Ï¹jÀê¥hiÖ u©KÃmµó +¡§›(QEí…6Ç;.]ðYv¨Y€<‹›0Ȓ¥†¡ŠÚÚҍä܂®¦†UªwˆÉ„ж’$’ƒvm«ÏCñ­4B–û,(­ÃÏyæìHSz óMééP²0¡ûYÖØ{Rù²-sÀ,˜OÁ= Âð^ÑVK£åª>·Ð>lîẘD›"”°=K0ožÊÞË·A6§‚:Z]£ ¾ +ÑTC®+wZ¶Žny‚PKô©˜!Ù#u­<"„’›/Km¡ÕÜÊÜ!KÕ°Lƒ¡L¬ñj®N(­£cñ¾+Òñ]û Áä¦×ґ{¡!¾Îu.ëß,,)³¥Æ÷7òßØú´J +¯º¡Á/‰cz(L{yÿ}®PíûY·#•.Ëi:¥€DÝt¦jˆ60SÌçT‘3qç¦L ¥RÆÖæfU§\ñŽ´6î¶',»k|֐›õñ>>MMï:tåîË%à¥ØùlB†8ûÛ÷ÖóÆÏÆñlHf™-§@Œ
+oÏù–¶ÐÖôÞÈúM×ò.[N)fÉõŠØ}a9MZNF©úvÀü¸”6DK(`E=³]6–X–.ȶŒy¨°¤9¸½~p¢ÉãV’¡MÝÄï](7^m5Nñ¬©u¼q(íÆ­ìòÍëiÃY¢` ۇ^™G@–õNô§QOÈßt¿L°üø6„ÝjµOºøPÂ;Y졛Ÿ-ù?¥(û¼µÝ×òÙìñîn 
+£¦ý”sÞ·œö^¥ýÏxIo„pXúþZü´j×®«m±BcsªP6ŽQ µý½Noaï`øèî~9y¦T.£Z‘(GvInQÊ°j\o×âÐO<É38ÖH­êRkyÎ o¯©Ûô¬ŽŽBYMó…:ãt¨çíý7±€…›1E·Ä¾ÚX|{µ}iM‰ÍÅCä`J“ãP,¶H¥†²±Oñ[úQ¶ƒI +!€xÊCe¨ŌÛÝÂó±×ä . [wJ÷Ì°Ø-2SlJÞgB倵ôÿÝ~x02Œiڐ£¢·ôµ÷Î9·ÌO¿oXøÞ`M»íÅâvñ?A>v•O\ÛV¿{Ï8<­ÕøŠù/•à‹ÒXɈÌýªQQ¾\‹@ +š›˜d++Só>¶ãì¦ç?hù|e–7ä:ÀFVúßÀ!?D\L¢¾æD»²–O?JoŒŠ¦@GÿšÇ8uµ¿9¸rK[í<=N3¥gÐüvÏÖñr,ˆ«‡·šQFÑ(õn3s¥»œû æé–~¯:ú¶ùãËm©u=¿Ð"äþëàvpF²­æ}-¾‰…]67˜›m³$
+Hsy1
+âςe$7<)¹©Ííá}´fç9T¢›ó¥ûgnÑ=åá“Ö{ù@Jw k|O þ\*-6wtôÖMéu€;ù. ^3m o=ÀQ‚Z¾&{·#ÈMû§µJ2ãÛôkTe˜¬±C+£y–ßt‹…“öOc[ÈMÂF¨Ë~ÝҀòñ±°q C«»Fñà€ZúÏF/K·àœÐ`ÿö½¾¼‚40zò÷8X:Îۃ¸}½Ø‹•4Ÿ&’µÍ®CåúÌhcxb8{öµ#=;Â>À @\‡æH¹œU7Æ·”ÆÒo–­ú [§:%'Yð Eƒ‡áu¾VGÉö™«&:õq\g….©[žSr Š9¹¬'D-|[ñ@ãªïŸœ°>A–ßµ“ßîéœ8@¡‹j©·»T†ß–ˆûžýŠ–oÿ¯s`°q„Ùëc~˜Êz/š‹`©‡šT™ nh@ xÔFÄ[ <3Õ¿tF7âRfðE”`K|„RýŠÈýBYÅDSߢÐc|ÔBÿ®žð×¾*Üô<)®þu7âEÛ2­ç~y”àÉ»¨_8;0Cõ|M9¼¤q­æÒ[z¡@…þ"r!7¨1
+nÒf¼!‚k°z G”À"£óßo•Ù؊…”}ômbêÉCç|ßiæäJŽr/è$qÀB¶—ìËՉ…VpòÃË°)¼Ž’]o£oäbˑJÒ!(*Ž¤¶é ‘ᐈ .9aMõûÎQ’H6aë
+:”ÇVÍ©¦‹ZRÛ> JҚ+:÷ÈùúÎÁ° ñ­P¼6þ³Cᔿ–›éÒù©áežyè2¥°Â]" +¡zÜøTkh{!ùB1¸T‘K ‡þ©U¸¯A{vÌo¹âj‘m…1<[Íw&!2;ŠYð)T±íxYcÛ¯èà¦ø̔šO¶QƝ™dZXŠûK•܋ɹ<ä1Ðí—Yéu
+kue… ñ}RÙaU£
+-ø7ùŸ®2fGDÜ¥$ª´$ªÝ!GiÛ;A­Þ×Ìw;–ŸÁgÀ=Å7Çù¦Zx®Ì°µ9„ufMŒ*–1¾ó—$æ[xRþ…° ”b·¨¶ CãÜý_F¼NߌU¾}nT‡ ¹[¶RàæDÊԟ¿” ­×êÔ “.¦oñÃåSª[%,ã©ÍT‹CktR£dMV’ »€µ‚/÷˜rø0ÿù=àÁ瑍…‰sÈÄl-llàð¿;WÁ—ÿÀáð ™ÐñÑêpÐßÀ 4숇‘à`*ÿ0節pp‘ +€á T$ŒF½Cwh¸-P„DÀ°ÌO€ÐÂׇ’= +¼ŒpbQʉüƒÎäøÀş׀ӏ9GWÀàYFlÂÜøðbÿý„àwˆ¢G‘9„g€Ð–<Ï_"wƒðq´7
+dG7xÀD(åšÉ°aÁ`"€j¸6ÿ€h¼È Ȑ4ø{ž}|Àv ÷€Øã8Ÿ @Z ÐÞð6Ø `85‘þ8èÀ9¨nà¾çp*$®õÌ qª€À, ¡¿‘ÀjÒúà@-à6 _ÿ™Cwx €óŸHv`l~x“˜ˆú;‹)ÅՄ¤µÛ
+ +n¤Z2BÂ@¢ýF#sâĔf6P¤!ø·E-¡hTR a(èz·Ê7Ô6à˜-„îÍ?Žÿn–æð&¥Ó÷I!JÃÉÊP(5ƪ<ðþúÀš~ùŤœ1Âhn…+l<ŸÄe§cYVÞrø6ü `wÿ…@î47pø Î3@°ø +ƒX€^ð¯C 0 £ @ñÿê€9õ +ÎØðât ÿþ(pát7õƒP€G,s€ÈžO¨ÔÂ)Š´qÔµCÇвQš8¦4â¶Á¯¨_€òÙñ
+J¡¥Œ¨3Ðs.—*]ƒZB8ú1¾Cž°kGʊ‹K’–‡†Œ8bځ­Ú„ì.ò2aUO* +z†7-C풖Q*Ià6ߜ|BÐe= +5օhœ Œ‚HÂö +F¬Ìʆ`Ó΂CþJ²lpíñ ´Ã· $«/¯ýð ²@rÖC)9cN'Ž-•r ‚ø=ÿü à€Ü ÀOã 4áFµ +ÌPø‚³à8ô° +õðfÿòp˜v8\ ßþ°5°°³mæèWáÊ$8…—Ð |G4ÀÓÿàGG™¿³Ãˆø:è÷KLÙFƒP³ì© :<0%c&Z›
+ª 7«=”ÈXÀʾ2’²·È7Ô4MðL‚`’
+nžwfû퐷a˜Þh^N:d¡Ô7ž³³‰e‡«›¤–œß¤×s˜à=À#<£²¤¨Ô»8@ÑãØçÏ}gQ5ÃZê ž³R”¿ÓÿâŸö2X©Š+- +’¾à|/­Rpӂ~Úè&~Ž1^£À²[v4ý /o{9y~ŒvZ4pf© +½&9KTð{y +ôjÀb'4>tXC2›î€®ÙaèçF£ö$ç û‡ãÂÜZr2`@Fß V㐰L…³¨œ:9.}=\-e@¡(xãƒ[¡ùXL§œ’”Pks¢–´ªIê¡a +Ó¦ÔK©V•H@?o•,1¾œ¦‰Ç7Q8G '™‘=őXq¯œÄ§Ç‘€9ÀjeœOàÇQò¸ê\ø¥l©R¡a@QÍ ½ˆ£èññV¡ÛªuJU-Ú*ÙOéFúo’o«hœ`˜% ‘ˆ%¡[1áafð<Öàg
+DÃÉãäoÙ<ÁÿìG<`ì´÷Ir“‰=!X¡/Íæ˜9]³Ñ5ËæDÒná‘Œ;h †_,„QX01$­€$<ôðüÊ’QJcÀ_øš¢ÚÕpف¦PÀòQ0°G1F‡°_€,ä²Ñ‡ð 'z©%œ!åp´…ͯª‚ª \öÚ¿ùf ¡ §¤mÄâwÿ›á"pێŸ ÒNËë[ºbðõ¼eo¿šÀzâsñ$– ÖÅ?T¤ô(¶ôÉ$-!ô +xB‡69—T«Iføâ›í͐ +´>yÈÛ EŽoS®²“y@r’›-ã”/*u8!»vËCBÿÙYM”惊P†Ä¾¾}U{tt1E@ æÁ*œYCáA¥§ŠUÚ·Gî<O…š ðæî;›ó·ÁǐÂÇ>Ç'C†—àxQá­è£Þ.Rt‘<hSu*Öè:+A;ìÕ_V QhŒbá-¿8€þ‚oý5à?ïúdcve4J@*¢b6+b+€ +Käx
+$¦$ï”A;þý¼â kÁ„º%‚<AÂa &-¿FÅcA+ÿ@ð&™âhnGÑY†+€˜ƒ`*P)`gè4 ¥ FB?$fðŸÍ€BP @®$ŒN±>]@’ +höd ž¨›°êã7ôšÖcÀÛVn {j¹š~e
+Œ2VÜPD ô +Zv}YEîQ „‚Ñóp6®O‰‰‹†a(Ð ¥MBJ +BCà ÉxGîmé £àpú
+_UžÖêh‰íùüG±:©*Ê ù±¹¶ à jØ<Ѐ ¼UoÓcÍ4J–c#Àа•¦lGð €
+pwà"aPД9áî €ñà>€P ÿA¿áTM•®•ï>Y=ï¨1B«h ÚV,Qжó@|ß^f@6څÂPpI>À_‘’ŒWl9húAa®X .Ð`-=C
+V$'áÅ£‰€¡h4j¢Q¶Ó¹±cF«8É ÐGç#4©àŠ +ŸXÎlj˜7ŽßÒíGœÂ~l0­(Ñöy©ÒЦ£':vh[5~A±®å8°‚Ù«sGZš Õ?Æ· ¬$Ï_9[Äç¤@›ÿ­çÐÙí¹­óîöÛ@âKAKô5#+Ü:O!÷_áóêks_L€y*VË5@Ù!±ºß ÁÍdp”<$` €*nhe‚oýÈ@À -øÔሠ,frg^@¯9 7&¥ÁoÿqÐà d0Ô(mŽêû+…†8¾dKPúÛÑ(ÆÆð’ÅiƁ9bƒÿiƒÿè”믣 ?þBU¦Š +;€ Y𣸵”‹/¿—ßËïÄäûúe÷é~—é|“/¿Kô¿Kô¿ÛïÐ=ÿý Å÷·¿ÿà`5¨NOµœ‰9Eüg›À“/¿—ߥü¾þ_~ÛçoÿÀâ4&à#Ù%€ z³‹î;¿ÚB7+ +~,þl” +eŒƒð̶Ê$óŒ¹aþF·=²ùˆvٲЎÎb5Q7Ìpq€Ü¼>²4MIìpfÿ”¥Í Í{/¿—ߥú_„äû| +ÀIGi¬hM @BØñÈπ–Ç1¸›ÍTSñ›x ºÊ?™•ƒ—À²µ-Âà37¬ªØ…êfˆe¡ ÿ…!$óã hN »j(Å_þâÂP. ÓŠ“òÏÿŽ¡9¿è?þ¥ûkíW<Œæ:BOÉ0~„YN…Нˆ ¥ Üé(í ÏBobl + \0'.<Bv¹ ’u ÔaÀÐÔ; dšàUáSͪ&Úԁˆ ɱ™Z~ÙM¢`fû!‰ã6ÏÇa9Í·ƒ?ò|D´ð‘BnƒÌ&Rk˜Œ*³/ö'‘ƒ VRÎÌzGšÿPfí€y¨Nl(ëçæÁ~ðфˆ'Õ à ÆåŒO>(%'ê˜"*ˆi á±7…’ä“©$ý ¡98Ði +p¿d…¼Ô'@LNDú˝”p\`xÓD¼“W‚¤t€’ +¿høKyô­Ï¢U +)ÖÀ|Á†¢ävËרMã¬h%dÏ·b7´v„½ Ò ‚
+éã~# ø¿ÄÎ.U¤ŸèNcŋ%"-SÖÙ©?Ñ
+¢u…Ž0]ôÎ<Œ¨ªy æ€éÄÁ :É¢^¬Z"¹Ù0œAËóàaIc*°gkР½½ˆ0º}úÀb€GBu„ÀjbyQi*INm¡¢ÊAÏóÑ ¡‰úá–Éʵ¬wÖã…Ñ;AÇ@à5æûK›Ÿ‹R'ùtN0ŒÁ€†€äd–R_n΋NC{›øb¾à¼áƒ\hxޅFQ9ÃçÐox{HPÓÿiD€ý?@áõ·
\ No newline at end of file
Index: branches/pj/mpeg2/initfile.c
===================================================================
--- branches/pj/mpeg2/initfile.c (nonexistent)
+++ branches/pj/mpeg2/initfile.c (revision 1085)
@@ -0,0 +1,256 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:45 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+#define PSCANSCHED 1
+#define NOTRACE
+
+int __register_sub_init_prologue(void)
+{
+#ifndef NOTRACE
+ int id;
+
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_trace_class(TRC_CLASS_USER);
+ trc_assign_class_to_queue(TRC_CLASS_USER,id);
+#endif
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+#if defined(EDFSCHED)
+ extern void BD_EDF_register_module(void);
+ BD_EDF_register_module();
+#elif defined(PSCANSCHED)
+ extern void BD_PSCAN_register_module(void);
+ BD_PSCAN_register_module();
+#endif
+ return 0;
+}
+
+dev_t root_device=-1;
+dev_t temp_device=-1;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+ */
+
+ return 0;
+}
+
+
+int __fs_sub_init(void)
+{
+ extern int libc_initialize(void);
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ // int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_def_options(fs,opts);
+
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+
+
+ filesystem_init(&fs);
+
+ /*
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ } else
+ cprintf("mounted /TEMP rw\n");
+ }
+ */
+
+ libc_initialize();
+
+#ifndef NOTRACE
+ TRC_init_phase2();
+#endif
+
+ return 0;
+}
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+#ifndef NOGRX
+ grx_close();
+#endif
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+
+
+
+
+
+
Index: branches/pj/mpeg2/store.ori
===================================================================
--- branches/pj/mpeg2/store.ori (nonexistent)
+++ branches/pj/mpeg2/store.ori (revision 1085)
@@ -0,0 +1,576 @@
+/* store.c, picture output routines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "global.h"
+
+/* private prototypes */
+static void store_one _ANSI_ARGS_((char *outname, unsigned char *src[],
+ int offset, int incr, int height));
+static void store_yuv _ANSI_ARGS_((char *outname, unsigned char *src[],
+ int offset, int incr, int height));
+static void store_sif _ANSI_ARGS_((char *outname, unsigned char *src[],
+ int offset, int incr, int height));
+static void store_ppm_tga _ANSI_ARGS_((char *outname, unsigned char *src[],
+ int offset, int incr, int height, int tgaflag));
+static void store_yuv1 _ANSI_ARGS_((char *name, unsigned char *src,
+ int offset, int incr, int width, int height));
+static void putbyte _ANSI_ARGS_((int c));
+static void putword _ANSI_ARGS_((int w));
+static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
+static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
+
+#define OBFRSIZE 4096
+static unsigned char obfr[OBFRSIZE];
+static unsigned char *optr;
+static int outfile;
+
+/*
+ * store a picture as either one frame or two fields
+ */
+void Write_Frame(src,frame)
+unsigned char *src[];
+int frame;
+{
+ char outname[FILENAME_LENGTH];
+
+ if (progressive_sequence || progressive_frame || Frame_Store_Flag)
+ {
+ /* progressive */
+ sprintf(outname,Output_Picture_Filename,frame,'f');
+ store_one(outname,src,0,Coded_Picture_Width,vertical_size);
+ }
+ else
+ {
+ /* interlaced */
+ sprintf(outname,Output_Picture_Filename,frame,'a');
+ store_one(outname,src,0,Coded_Picture_Width<<1,vertical_size>>1);
+
+ sprintf(outname,Output_Picture_Filename,frame,'b');
+ store_one(outname,src,
+ Coded_Picture_Width,Coded_Picture_Width<<1,vertical_size>>1);
+ }
+}
+
+/*
+ * store one frame or one field
+ */
+static void store_one(outname,src,offset,incr,height)
+char *outname;
+unsigned char *src[];
+int offset, incr, height;
+{
+ switch (Output_Type)
+ {
+ case T_YUV:
+ store_yuv(outname,src,offset,incr,height);
+ break;
+ case T_SIF:
+ store_sif(outname,src,offset,incr,height);
+ break;
+ case T_TGA:
+ store_ppm_tga(outname,src,offset,incr,height,1);
+ break;
+ case T_PPM:
+ store_ppm_tga(outname,src,offset,incr,height,0);
+ break;
+#ifdef DISPLAY
+ case T_X11:
+ dither(src);
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+/* separate headerless files for y, u and v */
+static void store_yuv(outname,src,offset,incr,height)
+char *outname;
+unsigned char *src[];
+int offset,incr,height;
+{
+ int hsize;
+ char tmpname[FILENAME_LENGTH];
+
+ hsize = horizontal_size;
+
+ sprintf(tmpname,"%s.Y",outname);
+ store_yuv1(tmpname,src[0],offset,incr,hsize,height);
+
+ if (chroma_format!=CHROMA444)
+ {
+ offset>>=1; incr>>=1; hsize>>=1;
+ }
+
+ if (chroma_format==CHROMA420)
+ {
+ height>>=1;
+ }
+
+ sprintf(tmpname,"%s.U",outname);
+ store_yuv1(tmpname,src[1],offset,incr,hsize,height);
+
+ sprintf(tmpname,"%s.V",outname);
+ store_yuv1(tmpname,src[2],offset,incr,hsize,height);
+}
+
+/* auxiliary routine */
+static void store_yuv1(name,src,offset,incr,width,height)
+char *name;
+unsigned char *src;
+int offset,incr,width,height;
+{
+ int i, j;
+ unsigned char *p;
+
+ if (!Quiet_Flag)
+ fprintf(stderr,"saving %s\n",name);
+
+ if ((outfile = open(name,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
+ {
+ sprintf(Error_Text,"Couldn't create %s\n",name);
+ Error(Error_Text);
+ }
+
+ optr=obfr;
+
+ for (i=0; i<height; i++)
+ {
+ p = src + offset + incr*i;
+ for (j=0; j<width; j++)
+ putbyte(*p++);
+ }
+
+ if (optr!=obfr)
+ write(outfile,obfr,optr-obfr);
+
+ close(outfile);
+}
+
+/*
+ * store as headerless file in U,Y,V,Y format
+ */
+static void store_sif (outname,src,offset,incr,height)
+char *outname;
+unsigned char *src[];
+int offset, incr, height;
+{
+ int i,j;
+ unsigned char *py, *pu, *pv;
+ static unsigned char *u422, *v422;
+
+ if (chroma_format==CHROMA444)
+ Error("4:4:4 not supported for SIF format");
+
+ if (chroma_format==CHROMA422)
+ {
+ u422 = src[1];
+ v422 = src[2];
+ }
+ else
+ {
+ if (!u422)
+ {
+ if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ }
+
+ conv420to422(src[1],u422);
+ conv420to422(src[2],v422);
+ }
+
+ strcat(outname,".SIF");
+
+ if (!Quiet_Flag)
+ fprintf(stderr,"saving %s\n",outname);
+
+ if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
+ {
+ sprintf(Error_Text,"Couldn't create %s\n",outname);
+ Error(Error_Text);
+ }
+
+ optr = obfr;
+
+ for (i=0; i<height; i++)
+ {
+ py = src[0] + offset + incr*i;
+ pu = u422 + (offset>>1) + (incr>>1)*i;
+ pv = v422 + (offset>>1) + (incr>>1)*i;
+
+ for (j=0; j<horizontal_size; j+=2)
+ {
+ putbyte(*pu++);
+ putbyte(*py++);
+ putbyte(*pv++);
+ putbyte(*py++);
+ }
+ }
+
+ if (optr!=obfr)
+ write(outfile,obfr,optr-obfr);
+
+ close(outfile);
+}
+
+/*
+ * store as PPM (PBMPLUS) or uncompressed Truevision TGA ('Targa') file
+ */
+static void store_ppm_tga(outname,src,offset,incr,height,tgaflag)
+char *outname;
+unsigned char *src[];
+int offset, incr, height;
+int tgaflag;
+{
+ int i, j;
+ int y, u, v, r, g, b;
+ int crv, cbu, cgu, cgv;
+ unsigned char *py, *pu, *pv;
+ static unsigned char tga24[14] = {0,0,2,0,0,0,0, 0,0,0,0,0,24,32};
+ char header[FILENAME_LENGTH];
+ static unsigned char *u422, *v422, *u444, *v444;
+
+ if (chroma_format==CHROMA444)
+ {
+ u444 = src[1];
+ v444 = src[2];
+ }
+ else
+ {
+ if (!u444)
+ {
+ if (chroma_format==CHROMA420)
+ {
+ if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ }
+
+ if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+
+ if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ }
+
+ if (chroma_format==CHROMA420)
+ {
+ conv420to422(src[1],u422);
+ conv420to422(src[2],v422);
+ conv422to444(u422,u444);
+ conv422to444(v422,v444);
+ }
+ else
+ {
+ conv422to444(src[1],u444);
+ conv422to444(src[2],v444);
+ }
+ }
+
+ strcat(outname,tgaflag ? ".tga" : ".ppm");
+
+ if (!Quiet_Flag)
+ fprintf(stderr,"saving %s\n",outname);
+
+ if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
+ {
+ sprintf(Error_Text,"Couldn't create %s\n",outname);
+ Error(Error_Text);
+ }
+
+ optr = obfr;
+
+ if (tgaflag)
+ {
+ /* TGA header */
+ for (i=0; i<12; i++)
+ putbyte(tga24[i]);
+
+ putword(horizontal_size); putword(height);
+ putbyte(tga24[12]); putbyte(tga24[13]);
+ }
+ else
+ {
+ /* PPM header */
+ sprintf(header,"P6\n%d %d\n255\n",horizontal_size,height);
+
+ for (i=0; header[i]!=0; i++)
+ putbyte(header[i]);
+ }
+
+ /* matrix coefficients */
+ crv = Inverse_Table_6_9[matrix_coefficients][0];
+ cbu = Inverse_Table_6_9[matrix_coefficients][1];
+ cgu = Inverse_Table_6_9[matrix_coefficients][2];
+ cgv = Inverse_Table_6_9[matrix_coefficients][3];
+
+ for (i=0; i<height; i++)
+ {
+ py = src[0] + offset + incr*i;
+ pu = u444 + offset + incr*i;
+ pv = v444 + offset + incr*i;
+
+ for (j=0; j<horizontal_size; j++)
+ {
+ u = *pu++ - 128;
+ v = *pv++ - 128;
+ y = 76309 * (*py++ - 16); /* (255/219)*65536 */
+ r = Clip[(y + crv*v + 32768)>>16];
+ g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
+ b = Clip[(y + cbu*u + 32786)>>16];
+
+ if (tgaflag)
+ {
+ putbyte(b); putbyte(g); putbyte(r);
+ }
+ else
+ {
+ putbyte(r); putbyte(g); putbyte(b);
+ }
+ }
+ }
+
+ if (optr!=obfr)
+ write(outfile,obfr,optr-obfr);
+
+ close(outfile);
+}
+
+static void putbyte(c)
+int c;
+{
+ *optr++ = c;
+
+ if (optr == obfr+OBFRSIZE)
+ {
+ write(outfile,obfr,OBFRSIZE);
+ optr = obfr;
+ }
+}
+
+static void putword(w)
+int w;
+{
+ putbyte(w); putbyte(w>>8);
+}
+
+/* horizontal 1:2 interpolation filter */
+static void conv422to444(src,dst)
+unsigned char *src,*dst;
+{
+ int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
+
+ w = Coded_Picture_Width>>1;
+
+ if (base.MPEG2_Flag)
+ {
+ for (j=0; j<Coded_Picture_Height; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ i2 = i<<1;
+ im2 = (i<2) ? 0 : i-2;
+ im1 = (i<1) ? 0 : i-1;
+ ip1 = (i<w-1) ? i+1 : w-1;
+ ip2 = (i<w-2) ? i+2 : w-1;
+ ip3 = (i<w-3) ? i+3 : w-1;
+
+ /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
+ /* even samples (0 0 256 0 0) */
+ dst[i2] = src[i];
+
+ /* odd samples (21 -52 159 159 -52 21) */
+ dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
+ -52*(src[im1]+src[ip2])
+ +159*(src[i]+src[ip1])+128)>>8];
+ }
+ src+= w;
+ dst+= Coded_Picture_Width;
+ }
+ }
+ else
+ {
+ for (j=0; j<Coded_Picture_Height; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+
+ i2 = i<<1;
+ im3 = (i<3) ? 0 : i-3;
+ im2 = (i<2) ? 0 : i-2;
+ im1 = (i<1) ? 0 : i-1;
+ ip1 = (i<w-1) ? i+1 : w-1;
+ ip2 = (i<w-2) ? i+2 : w-1;
+ ip3 = (i<w-3) ? i+3 : w-1;
+
+ /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
+ dst[i2] = Clip[(int)( 5*src[im3]
+ -21*src[im2]
+ +70*src[im1]
+ +228*src[i]
+ -37*src[ip1]
+ +11*src[ip2]+128)>>8];
+
+ dst[i2+1] = Clip[(int)( 5*src[ip3]
+ -21*src[ip2]
+ +70*src[ip1]
+ +228*src[i]
+ -37*src[im1]
+ +11*src[im2]+128)>>8];
+ }
+ src+= w;
+ dst+= Coded_Picture_Width;
+ }
+ }
+}
+
+/* vertical 1:2 interpolation filter */
+static void conv420to422(src,dst)
+unsigned char *src,*dst;
+{
+ int w, h, i, j, j2;
+ int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
+
+ w = Coded_Picture_Width>>1;
+ h = Coded_Picture_Height>>1;
+
+ if (progressive_frame)
+ {
+ /* intra frame */
+ for (i=0; i<w; i++)
+ {
+ for (j=0; j<h; j++)
+ {
+ j2 = j<<1;
+ jm3 = (j<3) ? 0 : j-3;
+ jm2 = (j<2) ? 0 : j-2;
+ jm1 = (j<1) ? 0 : j-1;
+ jp1 = (j<h-1) ? j+1 : h-1;
+ jp2 = (j<h-2) ? j+2 : h-1;
+ jp3 = (j<h-3) ? j+3 : h-1;
+
+ /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
+ /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
+ dst[w*j2] = Clip[(int)( 3*src[w*jm3]
+ -16*src[w*jm2]
+ +67*src[w*jm1]
+ +227*src[w*j]
+ -32*src[w*jp1]
+ +7*src[w*jp2]+128)>>8];
+
+ dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
+ -16*src[w*jp2]
+ +67*src[w*jp1]
+ +227*src[w*j]
+ -32*src[w*jm1]
+ +7*src[w*jm2]+128)>>8];
+ }
+ src++;
+ dst++;
+ }
+ }
+ else
+ {
+ /* intra field */
+ for (i=0; i<w; i++)
+ {
+ for (j=0; j<h; j+=2)
+ {
+ j2 = j<<1;
+
+ /* top field */
+ jm6 = (j<6) ? 0 : j-6;
+ jm4 = (j<4) ? 0 : j-4;
+ jm2 = (j<2) ? 0 : j-2;
+ jp2 = (j<h-2) ? j+2 : h-2;
+ jp4 = (j<h-4) ? j+4 : h-2;
+ jp6 = (j<h-6) ? j+6 : h-2;
+
+ /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
+ /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
+ dst[w*j2] = Clip[(int)( 1*src[w*jm6]
+ -7*src[w*jm4]
+ +30*src[w*jm2]
+ +248*src[w*j]
+ -21*src[w*jp2]
+ +5*src[w*jp4]+128)>>8];
+
+ /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
+ /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
+ dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
+ -35*src[w*jm2]
+ +194*src[w*j]
+ +110*src[w*jp2]
+ -24*src[w*jp4]
+ +4*src[w*jp6]+128)>>8];
+
+ /* bottom field */
+ jm5 = (j<5) ? 1 : j-5;
+ jm3 = (j<3) ? 1 : j-3;
+ jm1 = (j<1) ? 1 : j-1;
+ jp1 = (j<h-1) ? j+1 : h-1;
+ jp3 = (j<h-3) ? j+3 : h-1;
+ jp5 = (j<h-5) ? j+5 : h-1;
+ jp7 = (j<h-7) ? j+7 : h-1;
+
+ /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
+ /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
+ dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
+ -35*src[w*jp3]
+ +194*src[w*jp1]
+ +110*src[w*jm1]
+ -24*src[w*jm3]
+ +4*src[w*jm5]+128)>>8];
+
+ dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
+ -7*src[w*jp5]
+ +30*src[w*jp3]
+ +248*src[w*jp1]
+ -21*src[w*jm1]
+ +5*src[w*jm3]+128)>>8];
+ }
+ src++;
+ dst++;
+ }
+ }
+}
Index: branches/pj/mpeg2/verify.c
===================================================================
--- branches/pj/mpeg2/verify.c (nonexistent)
+++ branches/pj/mpeg2/verify.c (revision 1085)
@@ -0,0 +1,303 @@
+/* verify.c
+ *
+ * Bitstream verification routines
+ *
+ *
+ */
+#ifdef VERIFY
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <math.h> /* needed for ceil() */
+
+#include "config.h"
+#include "global.h"
+
+/* #define DEBUG */
+#ifdef DEBUG
+#define PC
+#endif
+
+#ifdef PC
+#include <conio.h> /* needed for getch() */
+#endif /* PC */
+
+/*
+ Check picture headers: due to the VBV definition of picture data,
+ this routine must be called immediately before any picture data
+ is parsed. (before the first slice start code, including any slice
+ start code stuffing).
+*/
+
+
+static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
+
+
+void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
+int Bitstream_Framenum;
+int Sequence_Framenum;
+{
+
+
+ if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
+ Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
+
+ /* clear out the header tracking variables so we have an accurate
+ count next time */
+ Clear_Verify_Headers();
+}
+
+
+
+/*
+ * Verify vbv_delay value in picture header
+ * (low_delay==1 checks not implemented. this does not exhaustively test all
+ * possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
+ * for constant rate streams)
+ *
+ * Q:how do we tell a variable rate stream from a constant rate stream anyway?
+ * it's not as simple as vbv_delay==0xFFFF, since we need meaningful
+ * vbv_delay values to calculate the piecewise rate in the first place!
+ *
+ * Also: no special provisions at the beginning or end of a sequence
+ */
+
+static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
+int Bitstream_Framenum;
+int Sequence_Framenum;
+{
+ double B; /* buffer size */
+ double Bn; /* buffer fullness for picture n */
+ double R; /* bitrate */
+ double I; /* time interval (t[n+1] - t[n]) */
+ double T; /* inverse of the frame rate (frame period) */
+
+ int d;
+ int internal_vbv_delay;
+
+ static int previous_IorP_picture_structure;
+ static int previous_IorP_repeat_first_field;
+ static int previous_IorP_top_field_first;
+ static int previous_vbv_delay;
+ static int previous_bitstream_position;
+
+ static double previous_Bn;
+ static double E; /* maximum quantization error or mismatch */
+
+
+
+ if((Sequence_Framenum==0)&&(!Second_Field))
+ { /* first coded picture of sequence */
+
+ R = bit_rate;
+
+ /* the initial buffer occupancy is taken on faith
+ that is, we believe what is transmitted in the first coded picture header
+ to be the true/actual buffer occupancy */
+
+ Bn = (R * (double) vbv_delay) / 90000.0;
+ B = 16 * 1024 * vbv_buffer_size;
+
+
+ /* maximum quantization error in bitrate (bit_rate_value is quantized/
+ rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
+ section 6.3.3 */
+
+ E = (400.0/frame_rate) + 400;
+
+#ifdef DEBUG
+ printf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
+ B, Bn, E, bit_rate, vbv_delay, frame_rate);
+#endif
+
+ }
+ else /* not the first coded picture of sequence */
+ {
+
+ /* derive the interval (I). The interval tells us how many constant rate bits
+ * will have been downloaded to the buffer during the current picture period
+ *
+ * interval assumes that:
+ * 1. whilst we are decoding the current I or P picture, we are displaying
+ * the previous I or P picture which was stored in the reorder
+ * buffer (pointed to by forward_reference_frame in this implementation)
+ *
+ * 2. B pictures are output ("displayed") at the time when they are decoded
+ *
+ */
+
+ if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
+ {
+
+ T = 1/frame_rate; /* inverse of the frame rate (frame period) */
+
+ if(picture_coding_type==B_TYPE)
+ {
+ if(repeat_first_field==1)
+ {
+ if(top_field_first==1)
+ I = T*3; /* three frame periods */
+ else
+ I = T*2; /* two frame periods */
+ }
+ else
+ I = T; /* one frame period */
+ }
+ else /* P or I frame */
+ {
+ if(previous_IorP_repeat_first_field==1)
+ {
+ if(previous_IorP_top_field_first==1)
+ I = 3*T;
+ else
+ I = 2*T;
+ }
+ else
+ I = T;
+ }
+ }
+ else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
+ {
+
+ T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
+
+ if(picture_coding_type==B_TYPE)
+ {
+ if(picture_structure==FRAME_PICTURE)
+ {
+ if(repeat_first_field==0)
+ I = 2*T; /* two field periods */
+ else
+ I = 3*T; /* three field periods */
+ }
+ else /* B field */
+ {
+ I = T; /* one field period */
+ }
+ }
+ else /* I or P picture */
+ {
+ if(picture_structure==FRAME_PICTURE)
+ {
+ if(previous_IorP_repeat_first_field==0)
+ I = 2*T;
+ else
+ I = 3*T;
+ }
+ else
+ {
+ if(Second_Field==0) /* first field of current frame */
+ I = T;
+ else /* second field of current frame */
+ {
+ /* formula: previous I or P display period (2*T or 3*T) minus the
+ very recent decode period (T) of the first field of the current
+ frame */
+
+ if(previous_IorP_picture_structure!=FRAME_PICTURE
+ || previous_IorP_repeat_first_field==0)
+ I = 2*T - T; /* a net of one field period */
+ else if(previous_IorP_picture_structure==FRAME_PICTURE
+ && previous_IorP_repeat_first_field==1)
+ I = 3*T - T; /* a net of two field periods */
+ }
+ }
+ }
+ }
+
+ /* derive coded size of previous picture */
+ d = ld->Bitcnt - previous_bitstream_position;
+
+ /* Rate = Distance/Time */
+
+ /* piecewise constant rate (variable rate stream) calculation
+ * R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
+ */
+
+ R = bit_rate;
+
+ /* compute buffer fullness just before removing picture n
+ *
+ * Bn = previous_Bn + (I*R) - d; (recursive formula)
+ *
+ * where:
+ *
+ * n is the current picture
+ *
+ * Bn is the buffer fullness for the current picture
+ *
+ * previous_Bn is the buffer fullness of the previous picture
+ *
+ * (I*R ) is the bits accumulated during the current picture
+ * period
+ *
+ * d is the number of bits removed during the decoding of the
+ * previous picture
+ */
+
+ Bn = previous_Bn + (I*R) - d;
+
+ /* compute internally derived vbv_delay (rouding up with ceil()) */
+ internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
+
+#ifdef DEBUG
+ printf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
+
+ printf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
+ printf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
+ picture_structure, picture_coding_type);
+
+ /* report error */
+ if(internal_vbv_delay != vbv_delay)
+ {
+ printf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
+ internal_vbv_delay, vbv_delay);
+ }
+#endif
+
+ } /* not the first coded picture of sequence */
+
+
+#ifdef PC
+ getch();
+#endif /* PC */
+
+ /* update generic tracking variables */
+ previous_bitstream_position = ld->Bitcnt ;
+ previous_vbv_delay = vbv_delay;
+ previous_Bn = Bn;
+
+ /* reference picture: reordered/delayed output picture */
+ if(picture_coding_type!=B_TYPE)
+ {
+ previous_IorP_repeat_first_field = repeat_first_field;
+ previous_IorP_top_field_first = top_field_first;
+ previous_IorP_picture_structure = picture_structure;
+ }
+
+}
+
+
+
+/* variables to keep track of the occurance of redundant headers between pictures */
+void Clear_Verify_Headers()
+{
+ verify_sequence_header = 0;
+ verify_group_of_pictures_header = 0;
+ verify_picture_header = 0;
+ verify_slice_header = 0;
+ verify_sequence_extension = 0;
+ verify_sequence_display_extension = 0;
+ verify_quant_matrix_extension = 0;
+ verify_sequence_scalable_extension = 0;
+ verify_picture_display_extension = 0;
+ verify_picture_coding_extension = 0;
+ verify_picture_spatial_scalable_extension = 0;
+ verify_picture_temporal_scalable_extension = 0;
+ verify_copyright_extension = 0;
+}
+
+#endif /* VERIFY */
+
Index: branches/pj/mpeg2/global.h
===================================================================
--- branches/pj/mpeg2/global.h (nonexistent)
+++ branches/pj/mpeg2/global.h (revision 1085)
@@ -0,0 +1,515 @@
+/* global.h, global variables */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include "mpeg2dec.h"
+
+/* choose between declaration (GLOBAL undefined)
+ * and definition (GLOBAL defined)
+ * GLOBAL is defined in exactly one file mpeg2dec.c)
+ */
+
+#ifndef GLOBAL
+#define EXTERN extern
+#else
+#define EXTERN
+#endif
+
+/* prototypes of global functions */
+/* readpic.c */
+void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
+ int sequence_framenum));
+
+/* Get_Bits.c */
+void Initialize_Buffer _ANSI_ARGS_((void));
+void Fill_Buffer _ANSI_ARGS_((void));
+unsigned int Show_Bits _ANSI_ARGS_((int n));
+unsigned int Get_Bits1 _ANSI_ARGS_((void));
+void Flush_Buffer _ANSI_ARGS_((int n));
+unsigned int Get_Bits _ANSI_ARGS_((int n));
+int Get_Byte _ANSI_ARGS_((void));
+int Get_Word _ANSI_ARGS_((void));
+
+/* systems.c */
+void Next_Packet _ANSI_ARGS_((void));
+int Get_Long _ANSI_ARGS_((void));
+void Flush_Buffer32 _ANSI_ARGS_((void));
+unsigned int Get_Bits32 _ANSI_ARGS_((void));
+
+
+/* getblk.c */
+void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
+void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
+void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
+void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
+
+/* gethdr.c */
+int Get_Hdr _ANSI_ARGS_((void));
+void next_start_code _ANSI_ARGS_((void));
+int slice_header _ANSI_ARGS_((void));
+void marker_bit _ANSI_ARGS_((char *text));
+
+/* getpic.c */
+void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
+ int sequence_framenum));
+void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
+
+/* getvlc.c */
+int Get_macroblock_type _ANSI_ARGS_((void));
+int Get_motion_code _ANSI_ARGS_((void));
+int Get_dmvector _ANSI_ARGS_((void));
+int Get_coded_block_pattern _ANSI_ARGS_((void));
+int Get_macroblock_address_increment _ANSI_ARGS_((void));
+int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
+int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
+
+/* idct.c */
+void Fast_IDCT _ANSI_ARGS_((short *block));
+void Initialize_Fast_IDCT _ANSI_ARGS_((void));
+
+/* Reference_IDCT.c */
+void Initialize_Reference_IDCT _ANSI_ARGS_((void));
+void Reference_IDCT _ANSI_ARGS_((short *block));
+
+/* motion.c */
+void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
+ int motion_vertical_field_select[2][2], int s, int motion_vector_count,
+ int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
+void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
+ int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
+void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
+
+/* mpeg2dec.c */
+void Error _ANSI_ARGS_((char *text));
+void Warning _ANSI_ARGS_((char *text));
+void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
+
+/* recon.c */
+void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
+ int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
+ int dmvector[2], int stwtype));
+
+/* spatscal.c */
+void Spatial_Prediction _ANSI_ARGS_((void));
+
+/* store.c */
+void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
+
+#ifdef DISPLAY
+/* display.c */
+void Initialize_Display_Process _ANSI_ARGS_((char *name));
+void Terminate_Display_Process _ANSI_ARGS_((void));
+void Display_Second_Field _ANSI_ARGS_((void));
+void dither _ANSI_ARGS_((unsigned char *src[]));
+void Initialize_Dither_Matrix _ANSI_ARGS_((void));
+#endif
+
+/* global variables */
+
+EXTERN char Version[]
+#ifdef GLOBAL
+ ="mpeg2decode V1.2a, 96/07/19"
+#endif
+;
+
+EXTERN char Author[]
+#ifdef GLOBAL
+ ="(C) 1996, MPEG Software Simulation Group"
+#endif
+;
+
+
+/* zig-zag and alternate scan patterns */
+EXTERN unsigned char scan[2][64]
+#ifdef GLOBAL
+=
+{
+ { /* Zig-Zag scan pattern */
+ 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
+ 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
+ 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
+ 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
+ },
+ { /* Alternate scan pattern */
+ 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
+ 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
+ 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
+ 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
+ }
+}
+#endif
+;
+
+/* default intra quantization matrix */
+EXTERN unsigned char default_intra_quantizer_matrix[64]
+#ifdef GLOBAL
+=
+{
+ 8, 16, 19, 22, 26, 27, 29, 34,
+ 16, 16, 22, 24, 27, 29, 34, 37,
+ 19, 22, 26, 27, 29, 34, 34, 38,
+ 22, 22, 26, 27, 29, 34, 37, 40,
+ 22, 26, 27, 29, 32, 35, 40, 48,
+ 26, 27, 29, 32, 35, 40, 48, 58,
+ 26, 27, 29, 34, 38, 46, 56, 69,
+ 27, 29, 35, 38, 46, 56, 69, 83
+}
+#endif
+;
+
+/* non-linear quantization coefficient table */
+EXTERN unsigned char Non_Linear_quantizer_scale[32]
+#ifdef GLOBAL
+=
+{
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8,10,12,14,16,18,20,22,
+ 24,28,32,36,40,44,48,52,
+ 56,64,72,80,88,96,104,112
+}
+#endif
+;
+
+/* color space conversion coefficients
+ * for YCbCr -> RGB mapping
+ *
+ * entries are {crv,cbu,cgu,cgv}
+ *
+ * crv=(255/224)*65536*(1-cr)/0.5
+ * cbu=(255/224)*65536*(1-cb)/0.5
+ * cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
+ * cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
+ *
+ * where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
+ */
+
+/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
+
+EXTERN int Inverse_Table_6_9[8][4]
+#ifdef GLOBAL
+=
+{
+ {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
+ {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
+ {104597, 132201, 25675, 53279}, /* unspecified */
+ {104597, 132201, 25675, 53279}, /* reserved */
+ {104448, 132798, 24759, 53109}, /* FCC */
+ {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
+ {104597, 132201, 25675, 53279}, /* SMPTE 170M */
+ {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
+}
+#endif
+;
+
+
+
+
+
+/* output types (Output_Type) */
+#define T_YUV 0
+#define T_SIF 1
+#define T_TGA 2
+#define T_PPM 3
+#define T_X11 4
+#define T_X11HIQ 5
+
+/* decoder operation control variables */
+EXTERN int Output_Type;
+EXTERN int hiQdither;
+
+/* decoder operation control flags */
+EXTERN int Quiet_Flag;
+EXTERN int Trace_Flag;
+EXTERN int Fault_Flag;
+EXTERN int Verbose_Flag;
+EXTERN int Two_Streams;
+EXTERN int Spatial_Flag;
+EXTERN int Reference_IDCT_Flag;
+EXTERN int Frame_Store_Flag;
+EXTERN int System_Stream_Flag;
+EXTERN int Display_Progressive_Flag;
+EXTERN int Ersatz_Flag;
+EXTERN int Big_Picture_Flag;
+EXTERN int Verify_Flag;
+EXTERN int Stats_Flag;
+EXTERN int User_Data_Flag;
+EXTERN int Main_Bitstream_Flag;
+
+
+/* filenames */
+EXTERN char *Output_Picture_Filename;
+EXTERN char *Substitute_Picture_Filename;
+EXTERN char *Main_Bitstream_Filename;
+EXTERN char *Enhancement_Layer_Bitstream_Filename;
+
+
+/* buffers for multiuse purposes */
+EXTERN char Error_Text[256];
+EXTERN unsigned char *Clip;
+
+/* pointers to generic picture buffers */
+EXTERN unsigned char *backward_reference_frame[3];
+EXTERN unsigned char *forward_reference_frame[3];
+
+EXTERN unsigned char *auxframe[3];
+EXTERN unsigned char *current_frame[3];
+EXTERN unsigned char *substitute_frame[3];
+
+
+/* pointers to scalability picture buffers */
+EXTERN unsigned char *llframe0[3];
+EXTERN unsigned char *llframe1[3];
+
+EXTERN short *lltmp;
+EXTERN char *Lower_Layer_Picture_Filename;
+
+
+
+
+/* non-normative variables derived from normative elements */
+EXTERN int Coded_Picture_Width;
+EXTERN int Coded_Picture_Height;
+EXTERN int Chroma_Width;
+EXTERN int Chroma_Height;
+EXTERN int block_count;
+EXTERN int Second_Field;
+EXTERN int profile, level;
+
+/* normative derived variables (as per ISO/IEC 13818-2) */
+EXTERN int horizontal_size;
+EXTERN int vertical_size;
+EXTERN int mb_width;
+EXTERN int mb_height;
+EXTERN double bit_rate;
+EXTERN double frame_rate;
+
+
+
+/* headers */
+
+/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
+EXTERN int aspect_ratio_information;
+EXTERN int frame_rate_code;
+EXTERN int bit_rate_value;
+EXTERN int vbv_buffer_size;
+EXTERN int constrained_parameters_flag;
+
+/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
+EXTERN int profile_and_level_indication;
+EXTERN int progressive_sequence;
+EXTERN int chroma_format;
+EXTERN int low_delay;
+EXTERN int frame_rate_extension_n;
+EXTERN int frame_rate_extension_d;
+
+/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
+EXTERN int video_format;
+EXTERN int color_description;
+EXTERN int color_primaries;
+EXTERN int transfer_characteristics;
+EXTERN int matrix_coefficients;
+EXTERN int display_horizontal_size;
+EXTERN int display_vertical_size;
+
+/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
+EXTERN int temporal_reference;
+EXTERN int picture_coding_type;
+EXTERN int vbv_delay;
+EXTERN int full_pel_forward_vector;
+EXTERN int forward_f_code;
+EXTERN int full_pel_backward_vector;
+EXTERN int backward_f_code;
+
+
+/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
+EXTERN int f_code[2][2];
+EXTERN int intra_dc_precision;
+EXTERN int picture_structure;
+EXTERN int top_field_first;
+EXTERN int frame_pred_frame_dct;
+EXTERN int concealment_motion_vectors;
+
+EXTERN int intra_vlc_format;
+
+EXTERN int repeat_first_field;
+
+EXTERN int chroma_420_type;
+EXTERN int progressive_frame;
+EXTERN int composite_display_flag;
+EXTERN int v_axis;
+EXTERN int field_sequence;
+EXTERN int sub_carrier;
+EXTERN int burst_amplitude;
+EXTERN int sub_carrier_phase;
+
+
+
+/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
+EXTERN int frame_center_horizontal_offset[3];
+EXTERN int frame_center_vertical_offset[3];
+
+
+
+/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
+EXTERN int layer_id;
+EXTERN int lower_layer_prediction_horizontal_size;
+EXTERN int lower_layer_prediction_vertical_size;
+EXTERN int horizontal_subsampling_factor_m;
+EXTERN int horizontal_subsampling_factor_n;
+EXTERN int vertical_subsampling_factor_m;
+EXTERN int vertical_subsampling_factor_n;
+
+
+/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
+EXTERN int lower_layer_temporal_reference;
+EXTERN int lower_layer_horizontal_offset;
+EXTERN int lower_layer_vertical_offset;
+EXTERN int spatial_temporal_weight_code_table_index;
+EXTERN int lower_layer_progressive_frame;
+EXTERN int lower_layer_deinterlaced_field_select;
+
+
+
+
+
+
+/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
+EXTERN int copyright_flag;
+EXTERN int copyright_identifier;
+EXTERN int original_or_copy;
+EXTERN int copyright_number_1;
+EXTERN int copyright_number_2;
+EXTERN int copyright_number_3;
+
+/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
+EXTERN int drop_flag;
+EXTERN int hour;
+EXTERN int minute;
+EXTERN int sec;
+EXTERN int frame;
+EXTERN int closed_gop;
+EXTERN int broken_link;
+
+
+
+/* layer specific variables (needed for SNR and DP scalability) */
+EXTERN struct layer_data {
+ /* bit input */
+ int Infile;
+ unsigned char Rdbfr[2048];
+ unsigned char *Rdptr;
+ unsigned char Inbfr[16];
+ /* from mpeg2play */
+ unsigned int Bfr;
+ unsigned char *Rdmax;
+ int Incnt;
+ int Bitcnt;
+ /* sequence header and quant_matrix_extension() */
+ int intra_quantizer_matrix[64];
+ int non_intra_quantizer_matrix[64];
+ int chroma_intra_quantizer_matrix[64];
+ int chroma_non_intra_quantizer_matrix[64];
+
+ int load_intra_quantizer_matrix;
+ int load_non_intra_quantizer_matrix;
+ int load_chroma_intra_quantizer_matrix;
+ int load_chroma_non_intra_quantizer_matrix;
+
+ int MPEG2_Flag;
+ /* sequence scalable extension */
+ int scalable_mode;
+ /* picture coding extension */
+ int q_scale_type;
+ int alternate_scan;
+ /* picture spatial scalable extension */
+ int pict_scal;
+ /* slice/macroblock */
+ int priority_breakpoint;
+ int quantizer_scale;
+ int intra_slice;
+ short block[12][64];
+} base, enhan, *ld;
+
+
+
+#ifdef VERIFY
+EXTERN int verify_sequence_header;
+EXTERN int verify_group_of_pictures_header;
+EXTERN int verify_picture_header;
+EXTERN int verify_slice_header;
+EXTERN int verify_sequence_extension;
+EXTERN int verify_sequence_display_extension;
+EXTERN int verify_quant_matrix_extension;
+EXTERN int verify_sequence_scalable_extension;
+EXTERN int verify_picture_display_extension;
+EXTERN int verify_picture_coding_extension;
+EXTERN int verify_picture_spatial_scalable_extension;
+EXTERN int verify_picture_temporal_scalable_extension;
+EXTERN int verify_copyright_extension;
+#endif /* VERIFY */
+
+
+EXTERN int Decode_Layer;
+
+/* verify.c */
+#ifdef VERIFY
+void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
+void Clear_Verify_Headers _ANSI_ARGS_((void));
+#endif /* VERIFY */
+
+
+EXTERN int global_MBA;
+EXTERN int global_pic;
+EXTERN int True_Framenum;
+
+// PJ
+
+void gvideo_init(void);
+
+// Insertion/removal from display buffer
+
+// number of preallocated frames
+#define MAX_FRAMEBUF 20
+
+struct framebuf_struct {
+ int n;
+ WORD *f;
+ struct framebuf_struct *next;
+ struct framebuf_struct *prev;
+};
+
+void Initialize_framebuf(int sz);
+struct framebuf_struct *get_free_framebuf();
+void insert_frame(struct framebuf_struct *f);
+struct framebuf_struct *remove_frame();
+void give_back_framebuf(struct framebuf_struct *f);
+void init_jetcontrol(void);
+
+
+
+
Index: branches/pj/mpeg2/motion.c
===================================================================
--- branches/pj/mpeg2/motion.c (nonexistent)
+++ branches/pj/mpeg2/motion.c (revision 1085)
@@ -0,0 +1,236 @@
+/* motion.c, motion vector decoding */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+
+/* private prototypes */
+static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
+ int motion_residualesidual, int full_pel_vector));
+
+/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
+void motion_vectors(PMV,dmvector,
+ motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
+int PMV[2][2][2];
+int dmvector[2];
+int motion_vertical_field_select[2][2];
+int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
+{
+ if (motion_vector_count==1)
+ {
+ if (mv_format==MV_FIELD && !dmv)
+ {
+ motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("motion_vertical_field_select[][%d] (%d): %d\n",s,
+ motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
+ }
+#endif /* TRACE */
+ }
+
+ motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
+
+ /* update other motion vector predictors */
+ PMV[1][s][0] = PMV[0][s][0];
+ PMV[1][s][1] = PMV[0][s][1];
+ }
+ else
+ {
+ motion_vertical_field_select[0][s] = Get_Bits(1);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
+ motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
+ }
+#endif /* TRACE */
+ motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
+
+ motion_vertical_field_select[1][s] = Get_Bits(1);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
+ motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
+ }
+#endif /* TRACE */
+ motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
+ }
+}
+
+/* get and decode motion vector and differential motion vector
+ for one prediction */
+void motion_vector(PMV,dmvector,
+ h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
+int *PMV;
+int *dmvector;
+int h_r_size;
+int v_r_size;
+int dmv; /* MPEG-2 only: get differential motion vectors */
+int mvscale; /* MPEG-2 only: field vector in frame pic */
+int full_pel_vector; /* MPEG-1 only */
+{
+ int motion_code, motion_residual;
+
+ /* horizontal component */
+ /* ISO/IEC 13818-2 Table B-10 */
+ motion_code = Get_motion_code();
+
+ motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ if (h_r_size!=0 && motion_code!=0)
+ {
+ printf("motion_residual (");
+ Print_Bits(motion_residual,h_r_size,h_r_size);
+ printf("): %d\n",motion_residual);
+ }
+ }
+#endif /* TRACE */
+
+
+ decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
+
+ if (dmv)
+ dmvector[0] = Get_dmvector();
+
+
+ /* vertical component */
+ motion_code = Get_motion_code();
+ motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ if (v_r_size!=0 && motion_code!=0)
+ {
+ printf("motion_residual (");
+ Print_Bits(motion_residual,v_r_size,v_r_size);
+ printf("): %d\n",motion_residual);
+ }
+ }
+#endif /* TRACE */
+
+ if (mvscale)
+ PMV[1] >>= 1; /* DIV 2 */
+
+ decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
+
+ if (mvscale)
+ PMV[1] <<= 1;
+
+ if (dmv)
+ dmvector[1] = Get_dmvector();
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("PMV = %d,%d\n",PMV[0],PMV[1]);
+#endif /* TRACE */
+}
+
+/* calculate motion vector component */
+/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
+/* Note: the arithmetic here is more elegant than that which is shown
+ in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
+
+static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
+int *pred;
+int r_size, motion_code, motion_residual;
+int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
+{
+ int lim, vec;
+
+ lim = 16<<r_size;
+ vec = full_pel_vector ? (*pred >> 1) : (*pred);
+
+ if (motion_code>0)
+ {
+ vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
+ if (vec>=lim)
+ vec-= lim + lim;
+ }
+ else if (motion_code<0)
+ {
+ vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
+ if (vec<-lim)
+ vec+= lim + lim;
+ }
+ *pred = full_pel_vector ? (vec<<1) : vec;
+}
+
+
+/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
+void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
+int DMV[][2];
+int *dmvector; /* differential motion vector */
+int mvx, mvy; /* decoded mv components (always in field format) */
+{
+ if (picture_structure==FRAME_PICTURE)
+ {
+ if (top_field_first)
+ {
+ /* vector for prediction of top field from bottom field */
+ DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
+ DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
+
+ /* vector for prediction of bottom field from top field */
+ DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
+ DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
+ }
+ else
+ {
+ /* vector for prediction of top field from bottom field */
+ DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
+ DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
+
+ /* vector for prediction of bottom field from top field */
+ DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
+ DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
+ }
+ }
+ else
+ {
+ /* vector for prediction from field of opposite 'parity' */
+ DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
+ DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
+
+ /* correct for vertical field shift */
+ if (picture_structure==TOP_FIELD)
+ DMV[0][1]--;
+ else
+ DMV[0][1]++;
+ }
+}
+
Index: branches/pj/mpeg2/recon.c
===================================================================
--- branches/pj/mpeg2/recon.c (nonexistent)
+++ branches/pj/mpeg2/recon.c (revision 1085)
@@ -0,0 +1,467 @@
+/* Predict.c, motion compensation routines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+
+/* private prototypes */
+static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
+ unsigned char *dst[], int dfield,
+ int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
+ int average_flag));
+
+static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
+ int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
+
+void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
+int bx, by;
+int macroblock_type;
+int motion_type;
+int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
+int stwtype;
+{
+ int currentfield;
+ unsigned char **predframe;
+ int DMV[2][2];
+ int stwtop, stwbot;
+
+ stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
+ stwbot = stwtype/3;
+
+ if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
+ || (picture_coding_type==P_TYPE))
+ {
+ if (picture_structure==FRAME_PICTURE)
+ {
+ if ((motion_type==MC_FRAME)
+ || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
+ {
+ /* frame-based prediction (broken into top and bottom halves
+ for spatial scalability prediction purposes) */
+ if (stwtop<2)
+ form_prediction(forward_reference_frame,0,current_frame,0,
+ Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
+ PMV[0][0][0],PMV[0][0][1],stwtop);
+
+ if (stwbot<2)
+ form_prediction(forward_reference_frame,1,current_frame,1,
+ Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
+ PMV[0][0][0],PMV[0][0][1],stwbot);
+ }
+ else if (motion_type==MC_FIELD) /* field-based prediction */
+ {
+ /* top field prediction */
+ if (stwtop<2)
+ form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
+ current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
+
+ /* bottom field prediction */
+ if (stwbot<2)
+ form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
+ current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
+ }
+ else if (motion_type==MC_DMV) /* dual prime prediction */
+ {
+ /* calculate derived motion vectors */
+ Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
+
+ if (stwtop<2)
+ {
+ /* predict top field from top field */
+ form_prediction(forward_reference_frame,0,current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
+ PMV[0][0][0],PMV[0][0][1]>>1,0);
+
+ /* predict and add to top field from bottom field */
+ form_prediction(forward_reference_frame,1,current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
+ DMV[0][0],DMV[0][1],1);
+ }
+
+ if (stwbot<2)
+ {
+ /* predict bottom field from bottom field */
+ form_prediction(forward_reference_frame,1,current_frame,1,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
+ PMV[0][0][0],PMV[0][0][1]>>1,0);
+
+ /* predict and add to bottom field from top field */
+ form_prediction(forward_reference_frame,0,current_frame,1,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
+ DMV[1][0],DMV[1][1],1);
+ }
+ }
+ else
+ /* invalid motion_type */
+ printf("invalid motion_type\n");
+ }
+ else /* TOP_FIELD or BOTTOM_FIELD */
+ {
+ /* field picture */
+ currentfield = (picture_structure==BOTTOM_FIELD);
+
+ /* determine which frame to use for prediction */
+ if ((picture_coding_type==P_TYPE) && Second_Field
+ && (currentfield!=motion_vertical_field_select[0][0]))
+ predframe = backward_reference_frame; /* same frame */
+ else
+ predframe = forward_reference_frame; /* previous frame */
+
+ if ((motion_type==MC_FIELD)
+ || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
+ {
+ /* field-based prediction */
+ if (stwtop<2)
+ form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
+ PMV[0][0][0],PMV[0][0][1],stwtop);
+ }
+ else if (motion_type==MC_16X8)
+ {
+ if (stwtop<2)
+ {
+ form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
+ PMV[0][0][0],PMV[0][0][1],stwtop);
+
+ /* determine which frame to use for lower half prediction */
+ if ((picture_coding_type==P_TYPE) && Second_Field
+ && (currentfield!=motion_vertical_field_select[1][0]))
+ predframe = backward_reference_frame; /* same frame */
+ else
+ predframe = forward_reference_frame; /* previous frame */
+
+ form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
+ PMV[1][0][0],PMV[1][0][1],stwtop);
+ }
+ }
+ else if (motion_type==MC_DMV) /* dual prime prediction */
+ {
+ if (Second_Field)
+ predframe = backward_reference_frame; /* same frame */
+ else
+ predframe = forward_reference_frame; /* previous frame */
+
+ /* calculate derived motion vectors */
+ Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
+
+ /* predict from field of same parity */
+ form_prediction(forward_reference_frame,currentfield,current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
+ PMV[0][0][0],PMV[0][0][1],0);
+
+ /* predict from field of opposite parity */
+ form_prediction(predframe,!currentfield,current_frame,0,
+ Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
+ DMV[0][0],DMV[0][1],1);
+ }
+ else
+ /* invalid motion_type */
+ printf("invalid motion_type\n");
+ }
+ stwtop = stwbot = 1;
+ }
+
+ if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
+ {
+ if (picture_structure==FRAME_PICTURE)
+ {
+ if (motion_type==MC_FRAME)
+ {
+ /* frame-based prediction */
+ if (stwtop<2)
+ form_prediction(backward_reference_frame,0,current_frame,0,
+ Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
+ PMV[0][1][0],PMV[0][1][1],stwtop);
+
+ if (stwbot<2)
+ form_prediction(backward_reference_frame,1,current_frame,1,
+ Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
+ PMV[0][1][0],PMV[0][1][1],stwbot);
+ }
+ else /* field-based prediction */
+ {
+ /* top field prediction */
+ if (stwtop<2)
+ form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
+ current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
+
+ /* bottom field prediction */
+ if (stwbot<2)
+ form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
+ current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
+ }
+ }
+ else /* TOP_FIELD or BOTTOM_FIELD */
+ {
+ /* field picture */
+ if (motion_type==MC_FIELD)
+ {
+ /* field-based prediction */
+ form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
+ current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
+ bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
+ }
+ else if (motion_type==MC_16X8)
+ {
+ form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
+ current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
+
+ form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
+ current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
+ bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
+ }
+ else
+ /* invalid motion_type */
+ printf("invalid motion_type\n");
+ }
+ }
+}
+
+static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
+unsigned char *src[]; /* prediction source buffer */
+int sfield; /* prediction source field number (0 or 1) */
+unsigned char *dst[]; /* prediction destination buffer */
+int dfield; /* prediction destination field number (0 or 1)*/
+int lx,lx2; /* line strides */
+int w,h; /* prediction block/sub-block width, height */
+int x,y; /* pixel co-ordinates of top-left sample in current MB */
+int dx,dy; /* horizontal, vertical prediction address */
+int average_flag; /* add prediction error to prediction ? */
+{
+ /* Y */
+ form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
+ lx,lx2,w,h,x,y,dx,dy,average_flag);
+
+ if (chroma_format!=CHROMA444)
+ {
+ lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
+ }
+
+ if (chroma_format==CHROMA420)
+ {
+ h>>=1; y>>=1; dy/=2;
+ }
+
+ /* Cb */
+ form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
+ lx,lx2,w,h,x,y,dx,dy,average_flag);
+
+ /* Cr */
+ form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
+ lx,lx2,w,h,x,y,dx,dy,average_flag);
+}
+
+/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
+/* NOTE: the arithmetic below produces numerically equivalent results
+ * to 7.6.4, yet is more elegant. It differs in the following ways:
+ *
+ * 1. the vectors (dx, dy) are based on cartesian frame
+ * coordiantes along a half-pel grid (always positive numbers)
+ * In contrast, vector[r][s][t] are differential (with positive and
+ * negative values). As a result, deriving the integer vectors
+ * (int_vec[t]) from dx, dy is accomplished by a simple right shift.
+ *
+ * 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
+ * Significant Bit) of the half-pel coordinates (dx,dy).
+ *
+ *
+ * NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
+ * is distributed among several other stages. This is accomplished by
+ * folding line offsets into the source and destination (src,dst)
+ * addresses (note the call arguments to form_prediction() in Predict()),
+ * line stride variables lx and lx2, the block dimension variables (w,h),
+ * average_flag, and by the very order in which Predict() is called.
+ * This implementation design (implicitly different than the spec)
+ * was chosen for its elegance.
+*/
+
+static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
+unsigned char *src;
+unsigned char *dst;
+int lx; /* raster line increment */
+int lx2;
+int w,h;
+int x,y;
+int dx,dy;
+int average_flag; /* flag that signals bi-directional or Dual-Prime
+ averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
+ a previously formed prediction has been stored in
+ pel_pred[] */
+{
+ int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
+ int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
+ int xh; /* horizontal half sample flag: analogous to half_flag[0] */
+ int yh; /* vertical half sample flag: analogous to half_flag[1] */
+ int i, j, v;
+ unsigned char *s; /* source pointer: analogous to pel_ref[][] */
+ unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
+
+ /* half pel scaling for integer vectors */
+ xint = dx>>1;
+ yint = dy>>1;
+
+ /* derive half pel flags */
+ xh = dx & 1;
+ yh = dy & 1;
+
+ /* compute the linear address of pel_ref[][] and pel_pred[][]
+ based on cartesian/raster cordinates provided */
+ s = src + lx*(y+yint) + x + xint;
+ d = dst + lx*y + x;
+
+ if (!xh && !yh) /* no horizontal nor vertical half-pel */
+ {
+ if (average_flag)
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ v = d[i]+s[i];
+ d[i] = (v+(v>=0?1:0))>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ else
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ d[i] = s[i];
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ }
+ else if (!xh && yh) /* no horizontal but vertical half-pel */
+ {
+ if (average_flag)
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
+ d[i]=(v+(v>=0?1:0))>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ else
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ }
+ else if (xh && !yh) /* horizontal but no vertical half-pel */
+ {
+ if (average_flag)
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
+ d[i] = (v+(v>=0?1:0))>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ else
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ }
+ else /* if (xh && yh) horizontal and vertical half-pel */
+ {
+ if (average_flag)
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
+ d[i] = (v+(v>=0?1:0))>>1;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ else
+ {
+ for (j=0; j<h; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
+ }
+
+ s+= lx2;
+ d+= lx2;
+ }
+ }
+ }
+}
Index: branches/pj/mpeg2/systems.c
===================================================================
--- branches/pj/mpeg2/systems.c (nonexistent)
+++ branches/pj/mpeg2/systems.c (revision 1085)
@@ -0,0 +1,200 @@
+/* systems.c, systems-specific routines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "global.h"
+
+/* initialize buffer, call once before first getbits or showbits */
+
+/* parse system layer, ignore everything we don't need */
+void Next_Packet()
+{
+ unsigned int code;
+ int l;
+
+ for(;;)
+ {
+ code = Get_Long();
+
+ /* remove system layer byte stuffing */
+ while ((code & 0xffffff00) != 0x100)
+ code = (code<<8) | Get_Byte();
+
+ switch(code)
+ {
+ case PACK_START_CODE: /* pack header */
+ /* skip pack header (system_clock_reference and mux_rate) */
+ ld->Rdptr += 8;
+ break;
+ case VIDEO_ELEMENTARY_STREAM:
+ code = Get_Word(); /* packet_length */
+ ld->Rdmax = ld->Rdptr + code;
+
+ code = Get_Byte();
+
+ if((code>>6)==0x02)
+ {
+ ld->Rdptr++;
+ code=Get_Byte(); /* parse PES_header_data_length */
+ ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
+ printf("MPEG-2 PES packet\n");
+ return;
+ }
+ else if(code==0xff)
+ {
+ /* parse MPEG-1 packet header */
+ while((code=Get_Byte())== 0xFF);
+ }
+
+ /* stuffing bytes */
+ if(code>=0x40)
+ {
+ if(code>=0x80)
+ {
+ fprintf(stderr,"Error in packet header\n");
+ exit(1);
+ }
+ /* skip STD_buffer_scale */
+ ld->Rdptr++;
+ code = Get_Byte();
+ }
+
+ if(code>=0x30)
+ {
+ if(code>=0x40)
+ {
+ fprintf(stderr,"Error in packet header\n");
+ exit(1);
+ }
+ /* skip presentation and decoding time stamps */
+ ld->Rdptr += 9;
+ }
+ else if(code>=0x20)
+ {
+ /* skip presentation time stamps */
+ ld->Rdptr += 4;
+ }
+ else if(code!=0x0f)
+ {
+ fprintf(stderr,"Error in packet header\n");
+ exit(1);
+ }
+ return;
+ case ISO_END_CODE: /* end */
+ /* simulate a buffer full of sequence end codes */
+ l = 0;
+ while (l<2048)
+ {
+ ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
+ ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
+ ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
+ ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
+ }
+ ld->Rdptr = ld->Rdbfr;
+ ld->Rdmax = ld->Rdbfr + 2048;
+ return;
+ default:
+ if(code>=SYSTEM_START_CODE)
+ {
+ /* skip system headers and non-video packets*/
+ code = Get_Word();
+ ld->Rdptr += code;
+ }
+ else
+ {
+ fprintf(stderr,"Unexpected startcode %08x in system layer\n",code);
+ exit(1);
+ }
+ break;
+ }
+ }
+}
+
+
+
+void Flush_Buffer32()
+{
+ int Incnt;
+
+ ld->Bfr = 0;
+
+ Incnt = ld->Incnt;
+ Incnt -= 32;
+
+ if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
+ {
+ while (Incnt <= 24)
+ {
+ if (ld->Rdptr >= ld->Rdmax)
+ Next_Packet();
+ ld->Bfr |= Get_Byte() << (24 - Incnt);
+ Incnt += 8;
+ }
+ }
+ else
+ {
+ while (Incnt <= 24)
+ {
+ if (ld->Rdptr >= ld->Rdbfr+2048)
+ Fill_Buffer();
+ ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
+ Incnt += 8;
+ }
+ }
+ ld->Incnt = Incnt;
+
+#ifdef VERIFY
+ ld->Bitcnt += 32;
+#endif /* VERIFY */
+}
+
+
+unsigned int Get_Bits32()
+{
+ unsigned int l;
+
+ l = Show_Bits(32);
+ Flush_Buffer32();
+
+ return l;
+}
+
+
+int Get_Long()
+{
+ int i;
+
+ i = Get_Word();
+ return (i<<16) | Get_Word();
+}
+
+
Index: branches/pj/mpeg2/getblk.c
===================================================================
--- branches/pj/mpeg2/getblk.c (nonexistent)
+++ branches/pj/mpeg2/getblk.c (revision 1085)
@@ -0,0 +1,570 @@
+/* getblk.c, DCT block decoding */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+
+
+/* defined in getvlc.h */
+typedef struct {
+ char run, level, len;
+} DCTtab;
+
+extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
+extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
+extern DCTtab DCTtab0a[],DCTtab1a[];
+
+
+/* decode one intra coded MPEG-1 block */
+
+void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
+int comp;
+int dc_dct_pred[];
+{
+ int val, i, j, sign;
+ unsigned int code;
+ DCTtab *tab;
+ short *bp;
+
+ bp = ld->block[comp];
+
+ /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
+ /* decode DC coefficients */
+ if (comp<4)
+ bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
+ else if (comp==4)
+ bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
+ else
+ bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
+
+ if (Fault_Flag) return;
+
+ /* D-pictures do not contain AC coefficients */
+ if(picture_coding_type == D_TYPE)
+ return;
+
+ /* decode AC coefficients */
+ for (i=1; ; i++)
+ {
+ code = Show_Bits(16);
+ if (code>=16384)
+ tab = &DCTtabnext[(code>>12)-4];
+ else if (code>=1024)
+ tab = &DCTtab0[(code>>8)-4];
+ else if (code>=512)
+ tab = &DCTtab1[(code>>6)-8];
+ else if (code>=256)
+ tab = &DCTtab2[(code>>4)-16];
+ else if (code>=128)
+ tab = &DCTtab3[(code>>3)-16];
+ else if (code>=64)
+ tab = &DCTtab4[(code>>2)-16];
+ else if (code>=32)
+ tab = &DCTtab5[(code>>1)-16];
+ else if (code>=16)
+ tab = &DCTtab6[code-16];
+ else
+ {
+ if (!Quiet_Flag)
+ printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ Flush_Buffer(tab->len);
+
+ if (tab->run==64) /* end_of_block */
+ return;
+
+ if (tab->run==65) /* escape */
+ {
+ i+= Get_Bits(6);
+
+ val = Get_Bits(8);
+ if (val==0)
+ val = Get_Bits(8);
+ else if (val==128)
+ val = Get_Bits(8) - 256;
+ else if (val>128)
+ val -= 256;
+
+ if((sign = (val<0)))
+ val = -val;
+ }
+ else
+ {
+ i+= tab->run;
+ val = tab->level;
+ sign = Get_Bits(1);
+ }
+
+ if (i>=64)
+ {
+ if (!Quiet_Flag)
+ fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ j = scan[ZIG_ZAG][i];
+ val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
+
+ /* mismatch control ('oddification') */
+ if (val!=0) /* should always be true, but it's not guaranteed */
+ val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
+
+ /* saturation */
+ if (!sign)
+ bp[j] = (val>2047) ? 2047 : val; /* positive */
+ else
+ bp[j] = (val>2048) ? -2048 : -val; /* negative */
+ }
+}
+
+
+/* decode one non-intra coded MPEG-1 block */
+
+void Decode_MPEG1_Non_Intra_Block(comp)
+int comp;
+{
+ int val, i, j, sign;
+ unsigned int code;
+ DCTtab *tab;
+ short *bp;
+
+ bp = ld->block[comp];
+
+ /* decode AC coefficients */
+ for (i=0; ; i++)
+ {
+ code = Show_Bits(16);
+ if (code>=16384)
+ {
+ if (i==0)
+ tab = &DCTtabfirst[(code>>12)-4];
+ else
+ tab = &DCTtabnext[(code>>12)-4];
+ }
+ else if (code>=1024)
+ tab = &DCTtab0[(code>>8)-4];
+ else if (code>=512)
+ tab = &DCTtab1[(code>>6)-8];
+ else if (code>=256)
+ tab = &DCTtab2[(code>>4)-16];
+ else if (code>=128)
+ tab = &DCTtab3[(code>>3)-16];
+ else if (code>=64)
+ tab = &DCTtab4[(code>>2)-16];
+ else if (code>=32)
+ tab = &DCTtab5[(code>>1)-16];
+ else if (code>=16)
+ tab = &DCTtab6[code-16];
+ else
+ {
+ if (!Quiet_Flag)
+ printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ Flush_Buffer(tab->len);
+
+ if (tab->run==64) /* end_of_block */
+ return;
+
+ if (tab->run==65) /* escape */
+ {
+ i+= Get_Bits(6);
+
+ val = Get_Bits(8);
+ if (val==0)
+ val = Get_Bits(8);
+ else if (val==128)
+ val = Get_Bits(8) - 256;
+ else if (val>128)
+ val -= 256;
+
+ if((sign = (val<0)))
+ val = -val;
+ }
+ else
+ {
+ i+= tab->run;
+ val = tab->level;
+ sign = Get_Bits(1);
+ }
+
+ if (i>=64)
+ {
+ if (!Quiet_Flag)
+ fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ j = scan[ZIG_ZAG][i];
+ val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
+
+ /* mismatch control ('oddification') */
+ if (val!=0) /* should always be true, but it's not guaranteed */
+ val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
+
+ /* saturation */
+ if (!sign)
+ bp[j] = (val>2047) ? 2047 : val; /* positive */
+ else
+ bp[j] = (val>2048) ? -2048 : -val; /* negative */
+ }
+}
+
+
+/* decode one intra coded MPEG-2 block */
+
+void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
+int comp;
+int dc_dct_pred[];
+{
+ int val, i, j, sign, nc, cc, run;
+ unsigned int code;
+ DCTtab *tab;
+ short *bp;
+ int *qmat;
+ struct layer_data *ld1;
+
+ /* with data partitioning, data always goes to base layer */
+ ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
+ bp = ld1->block[comp];
+
+ if (base.scalable_mode==SC_DP)
+ if (base.priority_breakpoint<64)
+ ld = &enhan;
+ else
+ ld = &base;
+
+ cc = (comp<4) ? 0 : (comp&1)+1;
+
+ qmat = (comp<4 || chroma_format==CHROMA420)
+ ? ld1->intra_quantizer_matrix
+ : ld1->chroma_intra_quantizer_matrix;
+
+ /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
+ if (cc==0)
+ val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
+ else if (cc==1)
+ val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
+ else
+ val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
+
+ if (Fault_Flag) return;
+
+ bp[0] = val << (3-intra_dc_precision);
+
+ nc=0;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("DCT(%d)i:",comp);
+#endif /* TRACE */
+
+ /* decode AC coefficients */
+ for (i=1; ; i++)
+ {
+ code = Show_Bits(16);
+ if (code>=16384 && !intra_vlc_format)
+ tab = &DCTtabnext[(code>>12)-4];
+ else if (code>=1024)
+ {
+ if (intra_vlc_format)
+ tab = &DCTtab0a[(code>>8)-4];
+ else
+ tab = &DCTtab0[(code>>8)-4];
+ }
+ else if (code>=512)
+ {
+ if (intra_vlc_format)
+ tab = &DCTtab1a[(code>>6)-8];
+ else
+ tab = &DCTtab1[(code>>6)-8];
+ }
+ else if (code>=256)
+ tab = &DCTtab2[(code>>4)-16];
+ else if (code>=128)
+ tab = &DCTtab3[(code>>3)-16];
+ else if (code>=64)
+ tab = &DCTtab4[(code>>2)-16];
+ else if (code>=32)
+ tab = &DCTtab5[(code>>1)-16];
+ else if (code>=16)
+ tab = &DCTtab6[code-16];
+ else
+ {
+ if (!Quiet_Flag)
+ printf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ Flush_Buffer(tab->len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf(" (");
+ Print_Bits(code,16,tab->len);
+ }
+#endif /* TRACE */
+
+ if (tab->run==64) /* end_of_block */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("): EOB\n");
+#endif /* TRACE */
+ return;
+ }
+
+ if (tab->run==65) /* escape */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ putchar(' ');
+ Print_Bits(Show_Bits(6),6,6);
+ }
+#endif /* TRACE */
+
+ i+= run = Get_Bits(6);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ putchar(' ');
+ Print_Bits(Show_Bits(12),12,12);
+ }
+#endif /* TRACE */
+
+ val = Get_Bits(12);
+ if ((val&2047)==0)
+ {
+ if (!Quiet_Flag)
+ printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+ if((sign = (val>=2048)))
+ val = 4096 - val;
+ }
+ else
+ {
+ i+= run = tab->run;
+ val = tab->level;
+ sign = Get_Bits(1);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("%d",sign);
+#endif /* TRACE */
+ }
+
+ if (i>=64)
+ {
+ if (!Quiet_Flag)
+ fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("): %d/%d",run,sign ? -val : val);
+#endif /* TRACE */
+
+ j = scan[ld1->alternate_scan][i];
+ val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
+ bp[j] = sign ? -val : val;
+ nc++;
+
+ if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
+ ld = &enhan;
+ }
+}
+
+
+/* decode one non-intra coded MPEG-2 block */
+
+void Decode_MPEG2_Non_Intra_Block(comp)
+int comp;
+{
+ int val, i, j, sign, nc, run;
+ unsigned int code;
+ DCTtab *tab;
+ short *bp;
+ int *qmat;
+ struct layer_data *ld1;
+
+ /* with data partitioning, data always goes to base layer */
+ ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
+ bp = ld1->block[comp];
+
+ if (base.scalable_mode==SC_DP)
+ if (base.priority_breakpoint<64)
+ ld = &enhan;
+ else
+ ld = &base;
+
+ qmat = (comp<4 || chroma_format==CHROMA420)
+ ? ld1->non_intra_quantizer_matrix
+ : ld1->chroma_non_intra_quantizer_matrix;
+
+ nc = 0;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("DCT(%d)n:",comp);
+#endif /* TRACE */
+
+ /* decode AC coefficients */
+ for (i=0; ; i++)
+ {
+ code = Show_Bits(16);
+ if (code>=16384)
+ {
+ if (i==0)
+ tab = &DCTtabfirst[(code>>12)-4];
+ else
+ tab = &DCTtabnext[(code>>12)-4];
+ }
+ else if (code>=1024)
+ tab = &DCTtab0[(code>>8)-4];
+ else if (code>=512)
+ tab = &DCTtab1[(code>>6)-8];
+ else if (code>=256)
+ tab = &DCTtab2[(code>>4)-16];
+ else if (code>=128)
+ tab = &DCTtab3[(code>>3)-16];
+ else if (code>=64)
+ tab = &DCTtab4[(code>>2)-16];
+ else if (code>=32)
+ tab = &DCTtab5[(code>>1)-16];
+ else if (code>=16)
+ tab = &DCTtab6[code-16];
+ else
+ {
+ if (!Quiet_Flag)
+ printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+ Flush_Buffer(tab->len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ printf(" (");
+ Print_Bits(code,16,tab->len);
+ }
+#endif /* TRACE */
+
+ if (tab->run==64) /* end_of_block */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("): EOB\n");
+#endif /* TRACE */
+ return;
+ }
+
+ if (tab->run==65) /* escape */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ putchar(' ');
+ Print_Bits(Show_Bits(6),6,6);
+ }
+#endif /* TRACE */
+
+ i+= run = Get_Bits(6);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ putchar(' ');
+ Print_Bits(Show_Bits(12),12,12);
+ }
+#endif /* TRACE */
+
+ val = Get_Bits(12);
+ if ((val&2047)==0)
+ {
+ if (!Quiet_Flag)
+ printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
+ Fault_Flag = 1;
+ return;
+ }
+ if((sign = (val>=2048)))
+ val = 4096 - val;
+ }
+ else
+ {
+ i+= run = tab->run;
+ val = tab->level;
+ sign = Get_Bits(1);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("%d",sign);
+#endif /* TRACE */
+ }
+
+ if (i>=64)
+ {
+ if (!Quiet_Flag)
+ fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)\n");
+ Fault_Flag = 1;
+ return;
+ }
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("): %d/%d",run,sign?-val:val);
+#endif /* TRACE */
+
+ j = scan[ld1->alternate_scan][i];
+ val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
+ bp[j] = sign ? -val : val;
+ nc++;
+
+ if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
+ ld = &enhan;
+ }
+}
Index: branches/pj/mpeg2/subspic.c
===================================================================
--- branches/pj/mpeg2/subspic.c (nonexistent)
+++ branches/pj/mpeg2/subspic.c (revision 1085)
@@ -0,0 +1,392 @@
+/* #define DEBUG */
+/* subspic.c, Frame buffer substitution routines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "global.h"
+
+/* private prototypes*/
+static void Read_Frame _ANSI_ARGS_((char *filename,
+ unsigned char *frame_buffer[], int framenum));
+static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
+ int width, int height, int parity, int incr));
+static int Read_Components _ANSI_ARGS_ ((char *filename,
+ unsigned char *frame[3], int framenum));
+static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
+ int width, int height));
+static int Extract_Components _ANSI_ARGS_ ((char *filename,
+ unsigned char *frame[3], int framenum));
+
+
+/* substitute frame buffer routine */
+void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
+int bitstream_framenum;
+int sequence_framenum;
+{
+ /* static tracking variables */
+ static int previous_temporal_reference;
+ static int previous_bitstream_framenum;
+ static int previous_anchor_temporal_reference;
+ static int previous_anchor_bitstream_framenum;
+ static int previous_picture_coding_type;
+ static int bgate;
+
+ /* local temporary variables */
+ int substitute_display_framenum;
+
+
+#ifdef DEBUG
+ printf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
+ sequence_framenum, bitstream_framenum, temporal_reference,
+ picture_structure, picture_coding_type);
+#endif
+
+ /* we don't substitute at the first picture of a sequence */
+ if((sequence_framenum!=0)||(Second_Field))
+ {
+ /* only at the start of the frame */
+ if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
+ {
+ if(picture_coding_type==P_TYPE)
+ {
+ /* the most recently decoded reference frame needs substituting */
+ substitute_display_framenum = bitstream_framenum - 1;
+
+ Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
+ substitute_display_framenum);
+ }
+ /* only the first B frame in a consequitve set of B pictures
+ loads a substitute backward_reference_frame since all subsequent
+ B frames predict from the same reference pictures */
+ else if((picture_coding_type==B_TYPE)&&(bgate!=1))
+ {
+ substitute_display_framenum =
+ (previous_temporal_reference - temporal_reference)
+ + bitstream_framenum - 1;
+
+ Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
+ substitute_display_framenum);
+ }
+ } /* P fields can predict from the two most recently decoded fields, even
+ from the first field of the same frame being decoded */
+ else if(Second_Field && (picture_coding_type==P_TYPE))
+ {
+ /* our favourite case: the IP field picture pair */
+ if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
+ {
+ substitute_display_framenum = bitstream_framenum;
+ }
+ else /* our more generic P field picture pair */
+ {
+ substitute_display_framenum =
+ (temporal_reference - previous_anchor_temporal_reference)
+ + bitstream_framenum - 1;
+ }
+
+ Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
+ }
+#ifdef DEBUG
+ else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
+ {
+ printf("NO SUBS FOR THIS PICTURE\n");
+ }
+#endif
+ }
+
+
+ /* set b gate so we don't redundantly load next time around */
+ if(picture_coding_type==B_TYPE)
+ bgate = 1;
+ else
+ bgate = 0;
+
+ /* update general tracking variables */
+ if((picture_structure==FRAME_PICTURE)||(!Second_Field))
+ {
+ previous_temporal_reference = temporal_reference;
+ previous_bitstream_framenum = bitstream_framenum;
+ }
+
+ /* update reference frame tracking variables */
+ if((picture_coding_type!=B_TYPE) &&
+ ((picture_structure==FRAME_PICTURE)||Second_Field))
+ {
+ previous_anchor_temporal_reference = temporal_reference;
+ previous_anchor_bitstream_framenum = bitstream_framenum;
+ }
+
+ previous_picture_coding_type = picture_coding_type;
+
+}
+
+
+/* Note: fields are only read to serve as the same-frame reference for
+ a second field */
+static void Read_Frame(fname,frame,framenum)
+char *fname;
+unsigned char *frame[];
+int framenum;
+{
+ int parity;
+ int rerr = 0;
+ int field_mode;
+
+ if(framenum<0)
+ printf("ERROR: framenum (%d) is less than zero\n", framenum);
+
+
+ if(Big_Picture_Flag)
+ rerr = Extract_Components(fname, substitute_frame, framenum);
+ else
+ rerr = Read_Components(fname, substitute_frame, framenum);
+
+ if(rerr!=0)
+ {
+ printf("was unable to substitute frame\n");
+ }
+
+ /* now copy to the appropriate buffer */
+ /* first field (which we are attempting to substitute) must be
+ of opposite field parity to the current one */
+ if((Second_Field)&&(picture_coding_type==P_TYPE))
+ {
+ parity = (picture_structure==TOP_FIELD ? 1:0);
+ field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
+ }
+ else
+ {
+ /* Like frame structued pictures, B pictures only substitute an entire frame
+ since both fields always predict from the same frame (with respect
+ to forward/backwards directions) */
+ parity = 0;
+ field_mode = 0;
+ }
+
+
+ Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
+ Coded_Picture_Height, parity, field_mode);
+
+ Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
+ parity, field_mode);
+
+ Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
+ parity, field_mode);
+
+#ifdef VERBOSE
+ if(Verbose_Flag > NO_LAYER)
+ printf("substituted %s %d\n",
+ (field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
+#endif
+}
+
+
+
+
+static int Read_Components(filename, frame, framenum)
+char *filename;
+unsigned char *frame[3];
+int framenum;
+{
+ int err = 0;
+ char outname[FILENAME_LENGTH];
+ char name[FILENAME_LENGTH];
+
+ sprintf(outname,filename,framenum);
+
+
+ sprintf(name,"%s.Y",outname);
+ err += Read_Component(name, frame[0], Coded_Picture_Width,
+ Coded_Picture_Height);
+
+ sprintf(name,"%s.U",outname);
+ err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
+
+ sprintf(name,"%s.V",outname);
+ err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
+
+ return(err);
+}
+
+
+static int Read_Component(Filename, Frame, Width, Height)
+char *Filename;
+unsigned char *Frame;
+int Width;
+int Height;
+{
+ int Size;
+ int Bytes_Read;
+ int Infile;
+
+ Size = Width*Height;
+
+#ifdef DEBUG
+ printf("SUBS: reading %s\n", filename);
+#endif
+
+ if(!(Infile=open(Filename,O_RDONLY|O_BINARY))<0)
+ {
+ printf("ERROR: unable to open reference filename (%s)\n", Filename);
+ return(-1);
+ }
+
+ Bytes_Read = read(Infile, Frame, Size);
+
+ if(Bytes_Read!=Size)
+ {
+ printf("was able to read only %d bytes of %d of file %s\n",
+ Bytes_Read, Size, Filename);
+ }
+
+ close(Infile);
+ return(0);
+}
+
+
+/* optimization: do not open the big file each time. Open once at start
+ of decoder, and close at the very last frame */
+
+/* Note: "big" files were used in E-mail exchanges almost exclusively by the
+ MPEG Committee's syntax validation and conformance ad-hoc groups from
+ the year 1993 until 1995 */
+static int Extract_Components(filename, frame, framenum)
+char *filename;
+unsigned char *frame[3];
+int framenum;
+{
+/* int err = 0; */
+ FILE *fd;
+ int line;
+ int size, offset;
+
+
+ if (!(fd = fopen(filename,"rb")))
+ {
+ sprintf(Error_Text,"Couldn't open %s\n",filename);
+ return(-1);
+ }
+
+ /* compute size of each frame (in bytes) */
+ size = (Coded_Picture_Width*Coded_Picture_Height);
+
+ if(chroma_format==CHROMA444)
+ size = (size * 3);
+ else if(chroma_format==CHROMA422)
+ size = (size * 2);
+ else if(chroma_format==CHROMA420)
+ size = ((size*3)>>1);
+ else
+ printf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
+
+
+ /* compute distance into "big" file */
+ offset = size*framenum;
+
+#ifdef DEBUG
+ printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
+ framenum, offset, size, filename);
+#endif
+
+ /* seek to location in big file where desired frame begins */
+ /* note: this offset cannot exceed a few billion bytes due to the */
+ /* obvious limitations of 32-bit integers */
+ fseek(fd, offset, 0);
+
+ /* Y */
+ for (line=0; line<Coded_Picture_Height; line++)
+ {
+ fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
+ }
+
+ /* Cb */
+ for (line=0; line<Chroma_Height; line++)
+ {
+ fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
+ }
+
+ /* Cr */
+ for (line=0; line<Chroma_Height; line++)
+ {
+ fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
+ }
+
+
+ fclose(fd);
+ return(0);
+}
+
+
+static void Copy_Frame(src, dst, width, height, parity, field_mode)
+unsigned char *src;
+unsigned char *dst;
+int width;
+int height;
+int parity; /* field parity (top or bottom) to overwrite */
+int field_mode; /* 0 = frame, 1 = field */
+{
+ int row, col;
+ int s, d;
+ int incr;
+
+ s = d = 0;
+
+#ifdef DEBUG
+ printf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
+ width,height,parity,field_mode);
+#endif /* DEBUG */
+
+ if(field_mode)
+ {
+ incr = 2;
+
+ if(parity==0)
+ s += width;
+ }
+ else
+ {
+ incr = 1;
+ }
+
+ for(row=0; row<height; row+=incr)
+ {
+ for(col=0; col<width; col++)
+ {
+ dst[d+col] = src[s+col];
+ }
+
+ d += (width*incr);
+ s += (width*incr);
+ }
+
+}
+
Index: branches/pj/mpeg2/spatscal.c
===================================================================
--- branches/pj/mpeg2/spatscal.c (nonexistent)
+++ branches/pj/mpeg2/spatscal.c (revision 1085)
@@ -0,0 +1,331 @@
+
+#include <stdio.h>
+#include "config.h"
+#include "global.h"
+
+/* private prototypes */
+static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
+static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
+static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
+ int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
+ short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
+ int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
+ int aperture));
+static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
+ int j0, int lx, int ly, int aperture));
+static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
+ int lx, int lys, int lyd, int m, int n, int j0, int dj));
+static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
+ int x0, int lx, int lxs, int lxd, int ly, int m, int n));
+
+
+
+/* get reference frame */
+void Spatial_Prediction()
+{
+
+ if(Frame_Store_Flag)
+ {
+ Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
+ lower_layer_prediction_vertical_size); /* Y */
+ Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
+ Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
+ }
+ else
+ {
+ Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
+ lower_layer_prediction_vertical_size); /* Y */
+ Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
+ Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
+ }
+
+
+ Make_Spatial_Prediction_Frame /* Y */
+ (progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
+ lltmp,current_frame[0],lower_layer_horizontal_offset,
+ lower_layer_vertical_offset,
+ lower_layer_prediction_horizontal_size,
+ lower_layer_prediction_vertical_size,
+ horizontal_size,vertical_size,vertical_subsampling_factor_m,
+ vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
+ horizontal_subsampling_factor_n,
+ picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
+
+ Make_Spatial_Prediction_Frame /* Cb */
+ (progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
+ lltmp,current_frame[1],lower_layer_horizontal_offset/2,
+ lower_layer_vertical_offset/2,
+ lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1,
+ horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
+ vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
+ horizontal_subsampling_factor_n,1);
+
+ Make_Spatial_Prediction_Frame /* Cr */
+ (progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
+ lltmp,current_frame[2],lower_layer_horizontal_offset/2,
+ lower_layer_vertical_offset/2,
+ lower_layer_prediction_horizontal_size>>1,
+ lower_layer_prediction_vertical_size>>1,
+ horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
+ vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
+ horizontal_subsampling_factor_n,1);
+
+}
+
+static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
+ int comp;
+ int lw, lh;
+{
+ FILE *fd;
+ char fname[256];
+ char ext[3][3] = {".Y",".U",".V"};
+/* char *ext = {".Y",".U",".V"}; */
+ int i,j;
+
+ sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum);
+ strcat(fname,ext[comp]);
+#ifdef VERBOSE
+ if (Verbose_Flag>1)
+ printf("reading %s\n",fname);
+#endif VERBOSE
+ fd=fopen(fname,"rb");
+ if (fd==NULL) sys_abort(-1); // PJ exit(-1);
+ for (j=0; j<lh; j++) {
+ for (i=0; i<lw; i++)
+ llframe0[comp][lw*j+i]=getc(fd);
+ if (! lower_layer_progressive_frame) {
+ j++;
+ for (i=0; i<lw; i++)
+ llframe1[comp][lw*j+i]=getc(fd);
+ }
+ }
+ fclose(fd);
+}
+
+
+static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
+ int comp;
+ int lw, lh;
+{
+ FILE *fd;
+ char fname[256];
+ char ext[3][3] = {".Y",".U",".V"};
+/* char *ext = {".Y",".U",".V"}; */
+ int i,j;
+
+ sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,lower_layer_progressive_frame ? 'f':'a');
+ strcat(fname,ext[comp]);
+#ifdef VERBOSE
+ if (Verbose_Flag>1)
+ printf("reading %s\n",fname);
+#endif VERBOSE
+ fd=fopen(fname,"rb");
+ if (fd==NULL) sys_abort(-1); // PJ exit(-1);
+ for (j=0; j<lh; j+=lower_layer_progressive_frame?1:2)
+ for (i=0; i<lw; i++)
+ llframe0[comp][lw*j+i]=getc(fd);
+ fclose(fd);
+
+ if (! lower_layer_progressive_frame) {
+ sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,'b');
+ strcat(fname,ext[comp]);
+#ifdef VERBOSE
+ if (Verbose_Flag>1)
+ printf("reading %s\n",fname);
+#endif VERBOSE
+ fd=fopen(fname,"rb");
+ if (fd==NULL) sys_abort(-1); // PJ exit(-1);
+ for (j=1; j<lh; j+=2)
+ for (i=0; i<lw; i++)
+ llframe1[comp][lw*j+i]=getc(fd);
+ fclose(fd);
+ }
+}
+
+
+/* form spatial prediction */
+static void Make_Spatial_Prediction_Frame(progressive_frame,
+ llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
+ vertical_size,vm,vn,hm,hn,aperture)
+int progressive_frame,llprogressive_frame;
+unsigned char *fld0,*fld1;
+short *tmp;
+unsigned char *dst;
+int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
+{
+ int w, h, x0, llw2, llh2;
+
+ llw2 = (llw*hn)/hm;
+ llh2 = (llh*vn)/vm;
+
+ if (llprogressive_frame)
+ {
+ /* progressive -> progressive / interlaced */
+ Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
+ }
+ else if (progressive_frame)
+ {
+ /* interlaced -> progressive */
+ if (lower_layer_deinterlaced_field_select)
+ {
+ Deinterlace(fld1,fld0,0,llw,llh,aperture);
+ Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
+ }
+ else
+ {
+ Deinterlace(fld0,fld1,1,llw,llh,aperture);
+ Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
+ }
+ }
+ else
+ {
+ /* interlaced -> interlaced */
+ Deinterlace(fld0,fld1,1,llw,llh,aperture);
+ Deinterlace(fld1,fld0,0,llw,llh,aperture);
+ Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
+ Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
+ }
+
+ /* vertical limits */
+ if (lly0<0)
+ {
+ tmp-= llw*lly0;
+ llh2+= lly0;
+ if (llh2<0)
+ llh2 = 0;
+ h = (vertical_size<llh2) ? vertical_size : llh2;
+ }
+ else
+ {
+ dst+= horizontal_size*lly0;
+ h= vertical_size - lly0;
+ if (h>llh2)
+ h = llh2;
+ }
+
+ /* horizontal limits */
+ if (llx0<0)
+ {
+ x0 = -llx0;
+ llw2+= llx0;
+ if (llw2<0)
+ llw2 = 0;
+ w = (horizontal_size<llw2) ? horizontal_size : llw2;
+ }
+ else
+ {
+ dst+= llx0;
+ x0 = 0;
+ w = horizontal_size - llx0;
+ if (w>llw2)
+ w = llw2;
+ }
+
+ Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
+}
+
+/* deinterlace one field (interpolate opposite parity samples)
+ *
+ * deinterlacing is done in-place: if j0=1, fld0 contains the input field in
+ * its even lines and the odd lines are interpolated by this routine
+ * if j0=0, the input field is in the odd lines and the even lines are
+ * interpolated
+ *
+ * fld0: field to be deinterlaced
+ * fld1: other field (referenced by the two field aperture filter)
+ * j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
+ * lx: width of fld0 and fld1
+ * ly: height of the deinterlaced field (has to be even)
+ * aperture: 1: use one field aperture filter (two field otherwise)
+ */
+static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
+unsigned char *fld0,*fld1;
+int j0,lx,ly; /* ly has to be even */
+int aperture;
+{
+ int i,j,v;
+ unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
+
+ /* deinterlace one field */
+ for (j=j0; j<ly; j+=2)
+ {
+ p0 = fld0+lx*j;
+ p0m1 = (j==0) ? p0+lx : p0-lx;
+ p0p1 = (j==ly-1) ? p0-lx : p0+lx;
+
+ if (aperture)
+ for (i=0; i<lx; i++)
+ p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
+ else
+ {
+ p1 = fld1 + lx*j;
+ p1m2 = (j<2) ? p1 : p1-2*lx;
+ p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
+ for (i=0; i<lx; i++)
+ {
+ v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
+ p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
+ }
+ }
+ }
+}
+
+/* vertical resampling */
+static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
+unsigned char *s;
+short *d;
+int lx, lys, lyd, m, n, j0, dj;
+{
+ int i, j, c1, c2, jd;
+ unsigned char *s1, *s2;
+ short *d1;
+
+ for (j=j0; j<lyd; j+=dj)
+ {
+ d1 = d + lx*j;
+ jd = (j*m)/n;
+ s1 = s + lx*jd;
+ s2 = (jd<lys-1)? s1+lx : s1;
+ c2 = (16*((j*m)%n) + (n>>1))/n;
+ c1 = 16 - c2;
+ for (i=0; i<lx; i++)
+ d1[i] = c1*s1[i] + c2*s2[i];
+ }
+}
+
+/* horizontal resampling */
+static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
+short *s;
+unsigned char *d;
+int x0, lx, lxs, lxd, ly, m, n;
+{
+ int i, i1, j, id, c1, c2, v;
+ short *s1, *s2;
+ unsigned char *d1;
+
+ for (i1=0; i1<lx; i1++)
+ {
+ d1 = d + i1;
+ i = x0 + i1;
+ id = (i*m)/n;
+ s1 = s+id;
+ s2 = (id<lxs-1) ? s1+1 : s1;
+ c2 = (16*((i*m)%n) + (n>>1))/n;
+ c1 = 16 - c2;
+ for (j=0; j<ly; j++)
+ {
+ v = c1*(*s1) + c2*(*s2);
+ *d1 = (v + ((v>=0) ? 128 : 127))>>8;
+ d1+= lxd;
+ s1+= lxs;
+ s2+= lxs;
+ }
+ }
+}
+
+
Index: branches/pj/mpeg2/readme
===================================================================
--- branches/pj/mpeg2/readme (nonexistent)
+++ branches/pj/mpeg2/readme (revision 1085)
@@ -0,0 +1,72 @@
+This is the S.Ha.R.K. porting of the MPEG2 decoder from the
+MPEG Software Simulation Group.
+
+---------------------------------------------------------------------------
+
+The original source code is available on the web at
+http://www.mpeg.org
+
+The demo uses the FAT16 filesystem and the graphics card.
+I just added these files:
+- gvideo.c Video initialization and output
+- jetctrl.c Idle time visualization
+- makefile S.Ha.R.K. Makefile for the demo
+- store.c interface between the original decoder and S.Ha.R.K.
+
+The original makefile and store.c files has also been renamed to store.ori.
+
+---------------------------------------------------------------------------
+
+The demo simply intercets the Write_Frame function and puts the decoded
+frame into a buffer. The task created in gvideo is a periodic CBS task
+that reads a picture from the buffer and simply displays it.
+
+===========================================================================
+
+This is the original readme file:
+
+
+January 9, 1995:
+=====
+Pre-release caveats:
+
+ - has only been tested with gcc. (I'm not sure we will even bother
+ with acc, or cc in the future).
+
+ - I'm fully aware of the warnings received by -Wall
+
+ - Verifier still not integrated (due to complexity), although
+ experimental vbv_delay code included in verify.c
+
+
+
+December 20, 1995
+===============================================================
+Frame buffer substitution edition of decoder.
+
+Restrictions:
+ - temporal_reference in bitstream must be correct.
+
+ - substitute pictures must have pixel (luminance samples) width
+ and height equal to coded_picture_width (mb_width*16) and
+ coded_picture_height (mb_height*16) rather than horizontal_size
+ and vertical_size, respectively.
+
+ - all input pictures must be interleaved into a frame.
+
+ - frame count (index) is based on absolute display frame order with
+ no repeated (3:2 pulldown) fields or frames.
+
+--------------------------------------------------------
+Notes:
+
+ - command line arguements in this edition differ from verifier
+ style. This decoder's arguments are the same as the
+ public distribution's (July 4, 1994) code .
+
+ please note that this code, with frame buffer substitution, when it
+ is released will use the verifier style of arguments.
+
+ - Carsten's updated spatial scalability decoder routines have been
+ incorperated.
+
Index: branches/pj/mpeg2/gvideo.c
===================================================================
--- branches/pj/mpeg2/gvideo.c (nonexistent)
+++ branches/pj/mpeg2/gvideo.c (revision 1085)
@@ -0,0 +1,157 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gvideo.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:45 $
+ */
+
+//#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "global.h"
+
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+
+#define SP rgb16(0,128,0)
+#define FG rgb16(255,255,255)
+#define BG rgb16(0,0,0)
+
+/* border size (pixels) */
+#define BO 4
+
+
+//#define NOGRX
+
+/*
+ *
+ */
+
+
+void draw_frame(int x, int y, int dx, int dy)
+{
+#ifndef NOGRX
+ grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
+ grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
+ grx_box(x,y,x+dx-1,y+dy-1,BG);
+ grx_rect(x-1,y-1,x+dx,y+dy,FG);
+#endif
+}
+
+static TASK play(void *arg)
+{
+ int x1,y1,x2,y2;
+ int moreframes;
+ struct framebuf_struct *fbuf;
+
+ x1=1;
+ y1=1;
+ x2=x1+Coded_Picture_Width-1;
+ y2=y1+Coded_Picture_Height-1;
+
+ moreframes=1;
+ task_nopreempt();
+
+ while (moreframes) {
+ fbuf = remove_frame();
+#ifndef NOGRX
+ // grxlock();
+// grx_rect(10,10,10+5*fbuf->n,10+5*fbuf->n,FG);
+ grx_putimage(x1, y1, x2, y2, fbuf->f);
+ // grxunlock();
+#else
+ cprintf("(%d %d)\n",fbuf->n, fbuf->f);
+#endif
+ give_back_framebuf(fbuf);
+ task_endcycle();
+ }
+
+ return NULL;
+}
+
+void gvideo_init(void)
+{
+ SOFT_TASK_MODEL model;
+ PID pid;
+ int period,wcet;
+
+#ifndef NOGRX
+ grx_init();
+ grx_setmode(grx_getmode(800, 600, 16));
+#endif
+
+ // draw_frame(0, 0, CodedImageWidth,CodedImageHeight);
+
+ srand(7);
+
+ period=1000000/20;
+ wcet=20000;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,wcet);
+ soft_task_def_wcet(model,wcet);
+ soft_task_def_period(model,period);
+ soft_task_def_periodic(model);
+ soft_task_def_ctrl_jet(model);
+
+ pid=task_create("Video",play,&model,NULL);
+ if (pid!=-1) task_activate(pid);
+}
+
+
+
+
+
+
+
+
Index: branches/pj/mpeg2/gethdr.c
===================================================================
--- branches/pj/mpeg2/gethdr.c (nonexistent)
+++ branches/pj/mpeg2/gethdr.c (revision 1085)
@@ -0,0 +1,1077 @@
+/* gethdr.c, header decoding */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+
+
+/* private prototypes */
+static void sequence_header _ANSI_ARGS_((void));
+static void group_of_pictures_header _ANSI_ARGS_((void));
+static void picture_header _ANSI_ARGS_((void));
+static void extension_and_user_data _ANSI_ARGS_((void));
+static void sequence_extension _ANSI_ARGS_((void));
+static void sequence_display_extension _ANSI_ARGS_((void));
+static void quant_matrix_extension _ANSI_ARGS_((void));
+static void sequence_scalable_extension _ANSI_ARGS_((void));
+static void picture_display_extension _ANSI_ARGS_((void));
+static void picture_coding_extension _ANSI_ARGS_((void));
+static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
+static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
+static int extra_bit_information _ANSI_ARGS_((void));
+static void copyright_extension _ANSI_ARGS_((void));
+static void user_data _ANSI_ARGS_((void));
+static void user_data _ANSI_ARGS_((void));
+
+
+
+
+/* introduced in September 1995 to assist spatial scalable decoding */
+static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
+/* private variables */
+static int Temporal_Reference_Base = 0;
+static int True_Framenum_max = -1;
+static int Temporal_Reference_GOP_Reset = 0;
+
+#define RESERVED -1
+static double frame_rate_Table[16] =
+{
+ 0.0,
+ ((23.0*1000.0)/1001.0),
+ 24.0,
+ 25.0,
+ ((30.0*1000.0)/1001.0),
+ 30.0,
+ 50.0,
+ ((60.0*1000.0)/1001.0),
+ 60.0,
+
+ RESERVED,
+ RESERVED,
+ RESERVED,
+ RESERVED,
+ RESERVED,
+ RESERVED,
+ RESERVED
+};
+
+/*
+ * decode headers from one input stream
+ * until an End of Sequence or picture start code
+ * is found
+ */
+int Get_Hdr()
+{
+ unsigned int code;
+
+ for (;;)
+ {
+ /* look for next_start_code */
+ next_start_code();
+ code = Get_Bits32();
+
+ switch (code)
+ {
+ case SEQUENCE_HEADER_CODE:
+ sequence_header();
+ break;
+ case GROUP_START_CODE:
+ group_of_pictures_header();
+ break;
+ case PICTURE_START_CODE:
+ picture_header();
+ return 1;
+ break;
+ case SEQUENCE_END_CODE:
+ return 0;
+ break;
+ default:
+ if (!Quiet_Flag)
+ fprintf(stderr,"Unexpected next_start_code %08x (ignored)\n",code);
+ break;
+ }
+ }
+}
+
+
+/* align to start of next next_start_code */
+
+void next_start_code()
+{
+ /* byte align */
+ Flush_Buffer(ld->Incnt&7);
+ while (Show_Bits(24)!=0x01L)
+ Flush_Buffer(8);
+}
+
+
+/* decode sequence header */
+
+static void sequence_header()
+{
+ int i;
+ int pos;
+
+ pos = ld->Bitcnt;
+ horizontal_size = Get_Bits(12);
+ vertical_size = Get_Bits(12);
+ aspect_ratio_information = Get_Bits(4);
+ frame_rate_code = Get_Bits(4);
+ bit_rate_value = Get_Bits(18);
+ marker_bit("sequence_header()");
+ vbv_buffer_size = Get_Bits(10);
+ constrained_parameters_flag = Get_Bits(1);
+
+ if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
+ }
+ else
+ {
+ for (i=0; i<64; i++)
+ ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
+ }
+
+ if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
+ }
+ else
+ {
+ for (i=0; i<64; i++)
+ ld->non_intra_quantizer_matrix[i] = 16;
+ }
+
+ /* copy luminance to chrominance matrices */
+ for (i=0; i<64; i++)
+ {
+ ld->chroma_intra_quantizer_matrix[i] =
+ ld->intra_quantizer_matrix[i];
+
+ ld->chroma_non_intra_quantizer_matrix[i] =
+ ld->non_intra_quantizer_matrix[i];
+ }
+
+#ifdef VERBOSE
+ if (Verbose_Flag > NO_LAYER)
+ {
+ printf("sequence header (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag > SEQUENCE_LAYER)
+ {
+ printf(" horizontal_size=%d\n",horizontal_size);
+ printf(" vertical_size=%d\n",vertical_size);
+ printf(" aspect_ratio_information=%d\n",aspect_ratio_information);
+ printf(" frame_rate_code=%d",frame_rate_code);
+ printf(" bit_rate_value=%d\n",bit_rate_value);
+ printf(" vbv_buffer_size=%d\n",vbv_buffer_size);
+ printf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
+ printf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
+ printf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_sequence_header++;
+#endif /* VERIFY */
+
+ extension_and_user_data();
+}
+
+
+
+/* decode group of pictures header */
+/* ISO/IEC 13818-2 section 6.2.2.6 */
+static void group_of_pictures_header()
+{
+ int pos;
+
+ if (ld == &base)
+ {
+ Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
+ Temporal_Reference_GOP_Reset = 1;
+ }
+ pos = ld->Bitcnt;
+ drop_flag = Get_Bits(1);
+ hour = Get_Bits(5);
+ minute = Get_Bits(6);
+ marker_bit("group_of_pictures_header()");
+ sec = Get_Bits(6);
+ frame = Get_Bits(6);
+ closed_gop = Get_Bits(1);
+ broken_link = Get_Bits(1);
+
+#ifdef VERBOSE
+ if (Verbose_Flag > NO_LAYER)
+ {
+ printf("group of pictures (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag > SEQUENCE_LAYER)
+ {
+ printf(" drop_flag=%d\n",drop_flag);
+ printf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
+ printf(" closed_gop=%d\n",closed_gop);
+ printf(" broken_link=%d\n",broken_link);
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_group_of_pictures_header++;
+#endif /* VERIFY */
+
+ extension_and_user_data();
+
+}
+
+
+/* decode picture header */
+
+/* ISO/IEC 13818-2 section 6.2.3 */
+static void picture_header()
+{
+ int pos;
+ int Extra_Information_Byte_Count;
+
+ /* unless later overwritten by picture_spatial_scalable_extension() */
+ ld->pict_scal = 0;
+
+ pos = ld->Bitcnt;
+ temporal_reference = Get_Bits(10);
+ picture_coding_type = Get_Bits(3);
+ vbv_delay = Get_Bits(16);
+
+ if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
+ {
+ full_pel_forward_vector = Get_Bits(1);
+ forward_f_code = Get_Bits(3);
+ }
+ if (picture_coding_type==B_TYPE)
+ {
+ full_pel_backward_vector = Get_Bits(1);
+ backward_f_code = Get_Bits(3);
+ }
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("picture header (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" temporal_reference=%d\n",temporal_reference);
+ printf(" picture_coding_type=%d\n",picture_coding_type);
+ printf(" vbv_delay=%d\n",vbv_delay);
+ if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
+ {
+ printf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
+ printf(" forward_f_code =%d\n",forward_f_code);
+ }
+ if (picture_coding_type==B_TYPE)
+ {
+ printf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
+ printf(" backward_f_code =%d\n",backward_f_code);
+ }
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_picture_header++;
+#endif /* VERIFY */
+
+ Extra_Information_Byte_Count =
+ extra_bit_information();
+
+ extension_and_user_data();
+
+ /* update tracking information used to assist spatial scalability */
+ Update_Temporal_Reference_Tacking_Data();
+}
+
+/* decode slice header */
+
+/* ISO/IEC 13818-2 section 6.2.4 */
+int slice_header()
+{
+ int slice_vertical_position_extension;
+ int quantizer_scale_code;
+ int pos;
+ int slice_picture_id_enable = 0;
+ int slice_picture_id = 0;
+ int extra_information_slice = 0;
+
+ pos = ld->Bitcnt;
+
+ slice_vertical_position_extension =
+ (ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
+
+ if (ld->scalable_mode==SC_DP)
+ ld->priority_breakpoint = Get_Bits(7);
+
+ quantizer_scale_code = Get_Bits(5);
+ ld->quantizer_scale =
+ ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
+
+ /* slice_id introduced in March 1995 as part of the video corridendum
+ (after the IS was drafted in November 1994) */
+ if (Get_Bits(1))
+ {
+ ld->intra_slice = Get_Bits(1);
+
+ slice_picture_id_enable = Get_Bits(1);
+ slice_picture_id = Get_Bits(6);
+
+ extra_information_slice = extra_bit_information();
+ }
+ else
+ ld->intra_slice = 0;
+
+#ifdef VERBOSE
+ if (Verbose_Flag>PICTURE_LAYER)
+ {
+ printf("slice header (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SLICE_LAYER)
+ {
+ if (ld->MPEG2_Flag && vertical_size>2800)
+ printf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
+
+ if (ld->scalable_mode==SC_DP)
+ printf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
+
+ printf(" quantizer_scale_code=%d\n",quantizer_scale_code);
+
+ printf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
+
+ if(slice_picture_id_enable)
+ printf(" slice_picture_id = %d\n", slice_picture_id);
+
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_slice_header++;
+#endif /* VERIFY */
+
+
+ return slice_vertical_position_extension;
+}
+
+
+/* decode extension and user data */
+/* ISO/IEC 13818-2 section 6.2.2.2 */
+static void extension_and_user_data()
+{
+ int code,ext_ID;
+
+ next_start_code();
+
+ while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
+ {
+ if (code==EXTENSION_START_CODE)
+ {
+ Flush_Buffer32();
+ ext_ID = Get_Bits(4);
+ switch (ext_ID)
+ {
+ case SEQUENCE_EXTENSION_ID:
+ sequence_extension();
+ break;
+ case SEQUENCE_DISPLAY_EXTENSION_ID:
+ sequence_display_extension();
+ break;
+ case QUANT_MATRIX_EXTENSION_ID:
+ quant_matrix_extension();
+ break;
+ case SEQUENCE_SCALABLE_EXTENSION_ID:
+ sequence_scalable_extension();
+ break;
+ case PICTURE_DISPLAY_EXTENSION_ID:
+ picture_display_extension();
+ break;
+ case PICTURE_CODING_EXTENSION_ID:
+ picture_coding_extension();
+ break;
+ case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
+ picture_spatial_scalable_extension();
+ break;
+ case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
+ picture_temporal_scalable_extension();
+ break;
+ case COPYRIGHT_EXTENSION_ID:
+ copyright_extension();
+ break;
+ default:
+ fprintf(stderr,"reserved extension start code ID %d\n",ext_ID);
+ break;
+ }
+ next_start_code();
+ }
+ else
+ {
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ printf("user data\n");
+#endif /* VERBOSE */
+ Flush_Buffer32();
+ user_data();
+ }
+ }
+}
+
+
+/* decode sequence extension */
+
+/* ISO/IEC 13818-2 section 6.2.2.3 */
+static void sequence_extension()
+{
+ int horizontal_size_extension;
+ int vertical_size_extension;
+ int bit_rate_extension;
+ int vbv_buffer_size_extension;
+ int pos;
+
+ /* derive bit position for trace */
+#ifdef VERBOSE
+ pos = ld->Bitcnt;
+#endif
+
+ ld->MPEG2_Flag = 1;
+
+ ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
+ layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
+
+ profile_and_level_indication = Get_Bits(8);
+ progressive_sequence = Get_Bits(1);
+ chroma_format = Get_Bits(2);
+ horizontal_size_extension = Get_Bits(2);
+ vertical_size_extension = Get_Bits(2);
+ bit_rate_extension = Get_Bits(12);
+ marker_bit("sequence_extension");
+ vbv_buffer_size_extension = Get_Bits(8);
+ low_delay = Get_Bits(1);
+ frame_rate_extension_n = Get_Bits(2);
+ frame_rate_extension_d = Get_Bits(5);
+
+ frame_rate = frame_rate_Table[frame_rate_code] *
+ ((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
+
+ /* special case for 422 profile & level must be made */
+ if((profile_and_level_indication>>7) & 1)
+ { /* escape bit of profile_and_level_indication set */
+
+ /* 4:2:2 Profile @ Main Level */
+ if((profile_and_level_indication&15)==5)
+ {
+ profile = PROFILE_422;
+ level = MAIN_LEVEL;
+ }
+ }
+ else
+ {
+ profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
+ level = profile_and_level_indication & 0xF; /* Level is lower nibble */
+ }
+
+
+ horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
+ vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
+
+
+ /* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
+ * both the original bit_rate_value parsed in sequence_header() and
+ * the optional bit_rate_extension in sequence_extension_header().
+ * However, we use it for bitstream verification purposes.
+ */
+
+ bit_rate_value += (bit_rate_extension << 18);
+ bit_rate = ((double) bit_rate_value) * 400.0;
+ vbv_buffer_size += (vbv_buffer_size_extension << 10);
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("sequence extension (byte %d)\n",(pos>>3)-4);
+
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" profile_and_level_indication=%d\n",profile_and_level_indication);
+
+ if (profile_and_level_indication<128)
+ {
+ printf(" profile=%d, level=%d\n",profile,level);
+ }
+
+ printf(" progressive_sequence=%d\n",progressive_sequence);
+ printf(" chroma_format=%d\n",chroma_format);
+ printf(" horizontal_size_extension=%d\n",horizontal_size_extension);
+ printf(" vertical_size_extension=%d\n",vertical_size_extension);
+ printf(" bit_rate_extension=%d\n",bit_rate_extension);
+ printf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
+ printf(" low_delay=%d\n",low_delay);
+ printf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
+ printf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_sequence_extension++;
+#endif /* VERIFY */
+
+
+}
+
+
+/* decode sequence display extension */
+
+static void sequence_display_extension()
+{
+ int pos;
+
+ pos = ld->Bitcnt;
+ video_format = Get_Bits(3);
+ color_description = Get_Bits(1);
+
+ if (color_description)
+ {
+ color_primaries = Get_Bits(8);
+ transfer_characteristics = Get_Bits(8);
+ matrix_coefficients = Get_Bits(8);
+ }
+
+ display_horizontal_size = Get_Bits(14);
+ marker_bit("sequence_display_extension");
+ display_vertical_size = Get_Bits(14);
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("sequence display extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+
+ printf(" video_format=%d\n",video_format);
+ printf(" color_description=%d\n",color_description);
+
+ if (color_description)
+ {
+ printf(" color_primaries=%d\n",color_primaries);
+ printf(" transfer_characteristics=%d\n",transfer_characteristics);
+ printf(" matrix_coefficients=%d\n",matrix_coefficients);
+ }
+ printf(" display_horizontal_size=%d\n",display_horizontal_size);
+ printf(" display_vertical_size=%d\n",display_vertical_size);
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_sequence_display_extension++;
+#endif /* VERIFY */
+
+}
+
+
+/* decode quant matrix entension */
+/* ISO/IEC 13818-2 section 6.2.3.2 */
+static void quant_matrix_extension()
+{
+ int i;
+ int pos;
+
+ pos = ld->Bitcnt;
+
+ if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ {
+ ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
+ = ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
+ = Get_Bits(8);
+ }
+ }
+
+ if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ {
+ ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
+ = ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
+ = Get_Bits(8);
+ }
+ }
+
+ if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
+ }
+
+ if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
+ {
+ for (i=0; i<64; i++)
+ ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
+ }
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("quant matrix extension (byte %d)\n",(pos>>3)-4);
+ printf(" load_intra_quantizer_matrix=%d\n",
+ ld->load_intra_quantizer_matrix);
+ printf(" load_non_intra_quantizer_matrix=%d\n",
+ ld->load_non_intra_quantizer_matrix);
+ printf(" load_chroma_intra_quantizer_matrix=%d\n",
+ ld->load_chroma_intra_quantizer_matrix);
+ printf(" load_chroma_non_intra_quantizer_matrix=%d\n",
+ ld->load_chroma_non_intra_quantizer_matrix);
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_quant_matrix_extension++;
+#endif /* VERIFY */
+
+}
+
+
+/* decode sequence scalable extension */
+/* ISO/IEC 13818-2 section 6.2.2.5 */
+static void sequence_scalable_extension()
+{
+ int pos;
+
+ pos = ld->Bitcnt;
+
+ /* values (without the +1 offset) of scalable_mode are defined in
+ Table 6-10 of ISO/IEC 13818-2 */
+ ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
+
+ layer_id = Get_Bits(4);
+
+ if (ld->scalable_mode==SC_SPAT)
+ {
+ lower_layer_prediction_horizontal_size = Get_Bits(14);
+ marker_bit("sequence_scalable_extension()");
+ lower_layer_prediction_vertical_size = Get_Bits(14);
+ horizontal_subsampling_factor_m = Get_Bits(5);
+ horizontal_subsampling_factor_n = Get_Bits(5);
+ vertical_subsampling_factor_m = Get_Bits(5);
+ vertical_subsampling_factor_n = Get_Bits(5);
+ }
+
+ if (ld->scalable_mode==SC_TEMP)
+ Error("temporal scalability not implemented\n");
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" scalable_mode=%d\n",ld->scalable_mode-1);
+ printf(" layer_id=%d\n",layer_id);
+ if (ld->scalable_mode==SC_SPAT)
+ {
+ printf(" lower_layer_prediction_horiontal_size=%d\n",
+ lower_layer_prediction_horizontal_size);
+ printf(" lower_layer_prediction_vertical_size=%d\n",
+ lower_layer_prediction_vertical_size);
+ printf(" horizontal_subsampling_factor_m=%d\n",
+ horizontal_subsampling_factor_m);
+ printf(" horizontal_subsampling_factor_n=%d\n",
+ horizontal_subsampling_factor_n);
+ printf(" vertical_subsampling_factor_m=%d\n",
+ vertical_subsampling_factor_m);
+ printf(" vertical_subsampling_factor_n=%d\n",
+ vertical_subsampling_factor_n);
+ }
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_sequence_scalable_extension++;
+#endif /* VERIFY */
+
+}
+
+
+/* decode picture display extension */
+/* ISO/IEC 13818-2 section 6.2.3.3. */
+static void picture_display_extension()
+{
+ int i;
+ int number_of_frame_center_offsets;
+ int pos;
+
+ pos = ld->Bitcnt;
+ /* based on ISO/IEC 13818-2 section 6.3.12
+ (November 1994) Picture display extensions */
+
+ /* derive number_of_frame_center_offsets */
+ if(progressive_sequence)
+ {
+ if(repeat_first_field)
+ {
+ if(top_field_first)
+ number_of_frame_center_offsets = 3;
+ else
+ number_of_frame_center_offsets = 2;
+ }
+ else
+ {
+ number_of_frame_center_offsets = 1;
+ }
+ }
+ else
+ {
+ if(picture_structure!=FRAME_PICTURE)
+ {
+ number_of_frame_center_offsets = 1;
+ }
+ else
+ {
+ if(repeat_first_field)
+ number_of_frame_center_offsets = 3;
+ else
+ number_of_frame_center_offsets = 2;
+ }
+ }
+
+
+ /* now parse */
+ for (i=0; i<number_of_frame_center_offsets; i++)
+ {
+ frame_center_horizontal_offset[i] = Get_Bits(16);
+ marker_bit("picture_display_extension, first marker bit");
+
+ frame_center_vertical_offset[i] = Get_Bits(16);
+ marker_bit("picture_display_extension, second marker bit");
+ }
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("picture display extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+
+ for (i=0; i<number_of_frame_center_offsets; i++)
+ {
+ printf(" frame_center_horizontal_offset[%d]=%d\n",i,
+ frame_center_horizontal_offset[i]);
+ printf(" frame_center_vertical_offset[%d]=%d\n",i,
+ frame_center_vertical_offset[i]);
+ }
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_picture_display_extension++;
+#endif /* VERIFY */
+
+}
+
+
+/* decode picture coding extension */
+static void picture_coding_extension()
+{
+ int pos;
+
+ pos = ld->Bitcnt;
+
+ f_code[0][0] = Get_Bits(4);
+ f_code[0][1] = Get_Bits(4);
+ f_code[1][0] = Get_Bits(4);
+ f_code[1][1] = Get_Bits(4);
+
+ intra_dc_precision = Get_Bits(2);
+ picture_structure = Get_Bits(2);
+ top_field_first = Get_Bits(1);
+ frame_pred_frame_dct = Get_Bits(1);
+ concealment_motion_vectors = Get_Bits(1);
+ ld->q_scale_type = Get_Bits(1);
+ intra_vlc_format = Get_Bits(1);
+ ld->alternate_scan = Get_Bits(1);
+ repeat_first_field = Get_Bits(1);
+ chroma_420_type = Get_Bits(1);
+ progressive_frame = Get_Bits(1);
+ composite_display_flag = Get_Bits(1);
+
+ if (composite_display_flag)
+ {
+ v_axis = Get_Bits(1);
+ field_sequence = Get_Bits(3);
+ sub_carrier = Get_Bits(1);
+ burst_amplitude = Get_Bits(7);
+ sub_carrier_phase = Get_Bits(8);
+ }
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("picture coding extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" forward horizontal f_code=%d\n", f_code[0][0]);
+ printf(" forward vertical f_code=%d\n", f_code[0][1]);
+ printf(" backward horizontal f_code=%d\n", f_code[1][0]);
+ printf(" backward_vertical f_code=%d\n", f_code[1][1]);
+ printf(" intra_dc_precision=%d\n",intra_dc_precision);
+ printf(" picture_structure=%d\n",picture_structure);
+ printf(" top_field_first=%d\n",top_field_first);
+ printf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
+ printf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
+ printf(" q_scale_type=%d\n",ld->q_scale_type);
+ printf(" intra_vlc_format=%d\n",intra_vlc_format);
+ printf(" alternate_scan=%d\n",ld->alternate_scan);
+ printf(" repeat_first_field=%d\n",repeat_first_field);
+ printf(" chroma_420_type=%d\n",chroma_420_type);
+ printf(" progressive_frame=%d\n",progressive_frame);
+ printf(" composite_display_flag=%d\n",composite_display_flag);
+
+ if (composite_display_flag)
+ {
+ printf(" v_axis=%d\n",v_axis);
+ printf(" field_sequence=%d\n",field_sequence);
+ printf(" sub_carrier=%d\n",sub_carrier);
+ printf(" burst_amplitude=%d\n",burst_amplitude);
+ printf(" sub_carrier_phase=%d\n",sub_carrier_phase);
+ }
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_picture_coding_extension++;
+#endif /* VERIFY */
+}
+
+
+/* decode picture spatial scalable extension */
+/* ISO/IEC 13818-2 section 6.2.3.5. */
+static void picture_spatial_scalable_extension()
+{
+ int pos;
+
+ pos = ld->Bitcnt;
+
+ ld->pict_scal = 1; /* use spatial scalability in this picture */
+
+ lower_layer_temporal_reference = Get_Bits(10);
+ marker_bit("picture_spatial_scalable_extension(), first marker bit");
+ lower_layer_horizontal_offset = Get_Bits(15);
+ if (lower_layer_horizontal_offset>=16384)
+ lower_layer_horizontal_offset-= 32768;
+ marker_bit("picture_spatial_scalable_extension(), second marker bit");
+ lower_layer_vertical_offset = Get_Bits(15);
+ if (lower_layer_vertical_offset>=16384)
+ lower_layer_vertical_offset-= 32768;
+ spatial_temporal_weight_code_table_index = Get_Bits(2);
+ lower_layer_progressive_frame = Get_Bits(1);
+ lower_layer_deinterlaced_field_select = Get_Bits(1);
+
+#ifdef VERBOSE
+ if (Verbose_Flag>NO_LAYER)
+ {
+ printf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
+ printf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
+ printf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
+ printf(" spatial_temporal_weight_code_table_index=%d\n",
+ spatial_temporal_weight_code_table_index);
+ printf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
+ printf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
+ }
+ }
+#endif /* VERBOSE */
+
+#ifdef VERIFY
+ verify_picture_spatial_scalable_extension++;
+#endif /* VERIFY */
+
+}
+
+
+/* decode picture temporal scalable extension
+ *
+ * not implemented
+ */
+/* ISO/IEC 13818-2 section 6.2.3.4. */
+static void picture_temporal_scalable_extension()
+{
+ Error("temporal scalability not supported\n");
+
+#ifdef VERIFY
+ verify_picture_temporal_scalable_extension++;
+#endif /* VERIFY */
+}
+
+
+/* decode extra bit information */
+/* ISO/IEC 13818-2 section 6.2.3.4. */
+static int extra_bit_information()
+{
+ int Byte_Count = 0;
+
+ while (Get_Bits1())
+ {
+ Flush_Buffer(8);
+ Byte_Count++;
+ }
+
+ return(Byte_Count);
+}
+
+
+
+/* ISO/IEC 13818-2 section 5.3 */
+/* Purpose: this function is mainly designed to aid in bitstream conformance
+ testing. A simple Flush_Buffer(1) would do */
+void marker_bit(text)
+char *text;
+{
+ int marker;
+
+ marker = Get_Bits(1);
+
+#ifdef VERIFY
+ if(!marker)
+ printf("ERROR: %s--marker_bit set to 0",text);
+#endif
+}
+
+
+/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
+static void user_data()
+{
+ /* skip ahead to the next start code */
+ next_start_code();
+}
+
+
+
+/* Copyright extension */
+/* ISO/IEC 13818-2 section 6.2.3.6. */
+/* (header added in November, 1994 to the IS document) */
+
+
+static void copyright_extension()
+{
+ int pos;
+ int reserved_data;
+
+ pos = ld->Bitcnt;
+
+
+ copyright_flag = Get_Bits(1);
+ copyright_identifier = Get_Bits(8);
+ original_or_copy = Get_Bits(1);
+
+ /* reserved */
+ reserved_data = Get_Bits(7);
+
+ marker_bit("copyright_extension(), first marker bit");
+ copyright_number_1 = Get_Bits(20);
+ marker_bit("copyright_extension(), second marker bit");
+ copyright_number_2 = Get_Bits(22);
+ marker_bit("copyright_extension(), third marker bit");
+ copyright_number_3 = Get_Bits(22);
+
+ if(Verbose_Flag>NO_LAYER)
+ {
+ printf("copyright_extension (byte %d)\n",(pos>>3)-4);
+ if (Verbose_Flag>SEQUENCE_LAYER)
+ {
+ printf(" copyright_flag =%d\n",copyright_flag);
+
+ printf(" copyright_identifier=%d\n",copyright_identifier);
+
+ printf(" original_or_copy = %d (original=1, copy=0)\n",
+ original_or_copy);
+
+ printf(" copyright_number_1=%d\n",copyright_number_1);
+ printf(" copyright_number_2=%d\n",copyright_number_2);
+ printf(" copyright_number_3=%d\n",copyright_number_3);
+ }
+ }
+
+#ifdef VERIFY
+ verify_copyright_extension++;
+#endif /* VERIFY */
+}
+
+
+
+/* introduced in September 1995 to assist Spatial Scalability */
+static void Update_Temporal_Reference_Tacking_Data()
+{
+ static int temporal_reference_wrap = 0;
+ static int temporal_reference_old = 0;
+
+ if (ld == &base) /* *CH* */
+ {
+ if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
+ /* check first field of */
+ {
+ /* non-B-frame */
+ if (temporal_reference_wrap)
+ {/* wrap occured at previous I- or P-frame */
+ /* now all intervening B-frames which could
+ still have high temporal_reference values are done */
+ Temporal_Reference_Base += 1024;
+ temporal_reference_wrap = 0;
+ }
+
+ /* distinguish from a reset */
+ if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
+ temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
+
+ temporal_reference_old = temporal_reference;
+ Temporal_Reference_GOP_Reset = 0;
+ }
+
+ True_Framenum = Temporal_Reference_Base + temporal_reference;
+
+ /* temporary wrap of TR at 1024 for M frames */
+ if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
+ True_Framenum += 1024;
+
+ True_Framenum_max = (True_Framenum > True_Framenum_max) ?
+ True_Framenum : True_Framenum_max;
+ }
+}
Index: branches/pj/mpeg2/m.bat
===================================================================
--- branches/pj/mpeg2/m.bat (nonexistent)
+++ branches/pj/mpeg2/m.bat (revision 1085)
@@ -0,0 +1 @@
+x mpeg2dec -b /shark/mpeg2/m.m2v
Index: branches/pj/mpeg2/idct.c
===================================================================
--- branches/pj/mpeg2/idct.c (nonexistent)
+++ branches/pj/mpeg2/idct.c (revision 1085)
@@ -0,0 +1,211 @@
+/* idct.c, inverse fast discrete cosine transform */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+/**********************************************************/
+/* inverse two dimensional DCT, Chen-Wang algorithm */
+/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
+/* 32-bit integer arithmetic (8 bit coefficients) */
+/* 11 mults, 29 adds per DCT */
+/* sE, 18.8.91 */
+/**********************************************************/
+/* coefficients extended to 12 bit for IEEE1180-1990 */
+/* compliance sE, 2.1.94 */
+/**********************************************************/
+
+/* this code assumes >> to be a two's-complement arithmetic */
+/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
+
+#include "config.h"
+
+#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
+#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
+#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
+#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
+#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
+#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
+
+/* global declarations */
+void Initialize_Fast_IDCT _ANSI_ARGS_((void));
+void Fast_IDCT _ANSI_ARGS_((short *block));
+
+/* private data */
+static short iclip[1024]; /* clipping table */
+static short *iclp;
+
+/* private prototypes */
+static void idctrow _ANSI_ARGS_((short *blk));
+static void idctcol _ANSI_ARGS_((short *blk));
+
+/* row (horizontal) IDCT
+ *
+ * 7 pi 1
+ * dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
+ * l=0 8 2
+ *
+ * where: c[0] = 128
+ * c[1..7] = 128*sqrt(2)
+ */
+
+static void idctrow(blk)
+short *blk;
+{
+ int x0, x1, x2, x3, x4, x5, x6, x7, x8;
+
+ /* shortcut */
+ if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
+ (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
+ {
+ blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
+ return;
+ }
+
+ x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
+
+ /* first stage */
+ x8 = W7*(x4+x5);
+ x4 = x8 + (W1-W7)*x4;
+ x5 = x8 - (W1+W7)*x5;
+ x8 = W3*(x6+x7);
+ x6 = x8 - (W3-W5)*x6;
+ x7 = x8 - (W3+W5)*x7;
+
+ /* second stage */
+ x8 = x0 + x1;
+ x0 -= x1;
+ x1 = W6*(x3+x2);
+ x2 = x1 - (W2+W6)*x2;
+ x3 = x1 + (W2-W6)*x3;
+ x1 = x4 + x6;
+ x4 -= x6;
+ x6 = x5 + x7;
+ x5 -= x7;
+
+ /* third stage */
+ x7 = x8 + x3;
+ x8 -= x3;
+ x3 = x0 + x2;
+ x0 -= x2;
+ x2 = (181*(x4+x5)+128)>>8;
+ x4 = (181*(x4-x5)+128)>>8;
+
+ /* fourth stage */
+ blk[0] = (x7+x1)>>8;
+ blk[1] = (x3+x2)>>8;
+ blk[2] = (x0+x4)>>8;
+ blk[3] = (x8+x6)>>8;
+ blk[4] = (x8-x6)>>8;
+ blk[5] = (x0-x4)>>8;
+ blk[6] = (x3-x2)>>8;
+ blk[7] = (x7-x1)>>8;
+}
+
+/* column (vertical) IDCT
+ *
+ * 7 pi 1
+ * dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
+ * l=0 8 2
+ *
+ * where: c[0] = 1/1024
+ * c[1..7] = (1/1024)*sqrt(2)
+ */
+static void idctcol(blk)
+short *blk;
+{
+ int x0, x1, x2, x3, x4, x5, x6, x7, x8;
+
+ /* shortcut */
+ if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
+ (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
+ {
+ blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
+ iclp[(blk[8*0]+32)>>6];
+ return;
+ }
+
+ x0 = (blk[8*0]<<8) + 8192;
+
+ /* first stage */
+ x8 = W7*(x4+x5) + 4;
+ x4 = (x8+(W1-W7)*x4)>>3;
+ x5 = (x8-(W1+W7)*x5)>>3;
+ x8 = W3*(x6+x7) + 4;
+ x6 = (x8-(W3-W5)*x6)>>3;
+ x7 = (x8-(W3+W5)*x7)>>3;
+
+ /* second stage */
+ x8 = x0 + x1;
+ x0 -= x1;
+ x1 = W6*(x3+x2) + 4;
+ x2 = (x1-(W2+W6)*x2)>>3;
+ x3 = (x1+(W2-W6)*x3)>>3;
+ x1 = x4 + x6;
+ x4 -= x6;
+ x6 = x5 + x7;
+ x5 -= x7;
+
+ /* third stage */
+ x7 = x8 + x3;
+ x8 -= x3;
+ x3 = x0 + x2;
+ x0 -= x2;
+ x2 = (181*(x4+x5)+128)>>8;
+ x4 = (181*(x4-x5)+128)>>8;
+
+ /* fourth stage */
+ blk[8*0] = iclp[(x7+x1)>>14];
+ blk[8*1] = iclp[(x3+x2)>>14];
+ blk[8*2] = iclp[(x0+x4)>>14];
+ blk[8*3] = iclp[(x8+x6)>>14];
+ blk[8*4] = iclp[(x8-x6)>>14];
+ blk[8*5] = iclp[(x0-x4)>>14];
+ blk[8*6] = iclp[(x3-x2)>>14];
+ blk[8*7] = iclp[(x7-x1)>>14];
+}
+
+/* two dimensional inverse discrete cosine transform */
+void Fast_IDCT(block)
+short *block;
+{
+ int i;
+
+ for (i=0; i<8; i++)
+ idctrow(block+8*i);
+
+ for (i=0; i<8; i++)
+ idctcol(block+i);
+}
+
+void Initialize_Fast_IDCT()
+{
+ int i;
+
+ iclp = iclip+512;
+ for (i= -512; i<512; i++)
+ iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
+}
Index: branches/pj/mpeg2/getvlc.c
===================================================================
--- branches/pj/mpeg2/getvlc.c (nonexistent)
+++ branches/pj/mpeg2/getvlc.c (revision 1085)
@@ -0,0 +1,799 @@
+/* getvlc.c, variable length decoding */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+
+#include "config.h"
+#include "global.h"
+#include "getvlc.h"
+
+/* private prototypes */
+/* generic picture macroblock type processing functions */
+static int Get_I_macroblock_type _ANSI_ARGS_((void));
+static int Get_P_macroblock_type _ANSI_ARGS_((void));
+static int Get_B_macroblock_type _ANSI_ARGS_((void));
+static int Get_D_macroblock_type _ANSI_ARGS_((void));
+
+/* spatial picture macroblock type processing functions */
+static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
+static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
+static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
+static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
+
+int Get_macroblock_type()
+{
+ int macroblock_type = 0;
+
+ if (ld->scalable_mode==SC_SNR)
+ macroblock_type = Get_SNR_macroblock_type();
+ else
+ {
+ switch (picture_coding_type)
+ {
+ case I_TYPE:
+ macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
+ break;
+ case P_TYPE:
+ macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
+ break;
+ case B_TYPE:
+ macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
+ break;
+ case D_TYPE:
+ macroblock_type = Get_D_macroblock_type();
+ break;
+ default:
+ printf("Get_macroblock_type(): unrecognized picture coding type\n");
+ break;
+ }
+ }
+
+ return macroblock_type;
+}
+
+static int Get_I_macroblock_type()
+{
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(I) ");
+#endif /* TRACE */
+
+ if (Get_Bits1())
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("(1): Intra (1)\n");
+#endif /* TRACE */
+ return 1;
+ }
+
+ if (!Get_Bits1())
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ }
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("(01): Intra, Quant (17)\n");
+#endif /* TRACE */
+
+ return 17;
+}
+
+static char *MBdescr[]={
+ "", "Intra", "No MC, Coded", "",
+ "Bwd, Not Coded", "", "Bwd, Coded", "",
+ "Fwd, Not Coded", "", "Fwd, Coded", "",
+ "Interp, Not Coded", "", "Interp, Coded", "",
+ "", "Intra, Quant", "No MC, Coded, Quant", "",
+ "", "", "Bwd, Coded, Quant", "",
+ "", "", "Fwd, Coded, Quant", "",
+ "", "", "Interp, Coded, Quant", ""
+};
+
+static int Get_P_macroblock_type()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(P) (");
+#endif /* TRACE */
+
+ if ((code = Show_Bits(6))>=8)
+ {
+ code >>= 3;
+ Flush_Buffer(PMBtab0[code].len);
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,3,PMBtab0[code].len);
+ printf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
+ }
+#endif /* TRACE */
+ return PMBtab0[code].val;
+ }
+
+ if (code==0)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ Flush_Buffer(PMBtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,6,PMBtab1[code].len);
+ printf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
+ }
+#endif /* TRACE */
+
+ return PMBtab1[code].val;
+}
+
+static int Get_B_macroblock_type()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(B) (");
+#endif /* TRACE */
+
+ if ((code = Show_Bits(6))>=8)
+ {
+ code >>= 2;
+ Flush_Buffer(BMBtab0[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,4,BMBtab0[code].len);
+ printf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
+ }
+#endif /* TRACE */
+
+ return BMBtab0[code].val;
+ }
+
+ if (code==0)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ Flush_Buffer(BMBtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,6,BMBtab1[code].len);
+ printf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
+ }
+#endif /* TRACE */
+
+ return BMBtab1[code].val;
+}
+
+static int Get_D_macroblock_type()
+{
+ if (!Get_Bits1())
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag=1;
+ }
+
+ return 1;
+}
+
+/* macroblock_type for pictures with spatial scalability */
+static int Get_I_Spatial_macroblock_type()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(I,spat) (");
+#endif /* TRACE */
+
+ code = Show_Bits(4);
+
+ if (code==0)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,4,spIMBtab[code].len);
+ printf("): %02x\n",spIMBtab[code].val);
+ }
+#endif /* TRACE */
+
+ Flush_Buffer(spIMBtab[code].len);
+ return spIMBtab[code].val;
+}
+
+static int Get_P_Spatial_macroblock_type()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(P,spat) (");
+#endif /* TRACE */
+
+ code = Show_Bits(7);
+
+ if (code<2)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ if (code>=16)
+ {
+ code >>= 3;
+ Flush_Buffer(spPMBtab0[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,4,spPMBtab0[code].len);
+ printf("): %02x\n",spPMBtab0[code].val);
+ }
+#endif /* TRACE */
+
+ return spPMBtab0[code].val;
+ }
+
+ Flush_Buffer(spPMBtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,7,spPMBtab1[code].len);
+ printf("): %02x\n",spPMBtab1[code].val);
+ }
+#endif /* TRACE */
+
+ return spPMBtab1[code].val;
+}
+
+static int Get_B_Spatial_macroblock_type()
+{
+ int code;
+ VLCtab *p;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_type(B,spat) (");
+#endif /* TRACE */
+
+ code = Show_Bits(9);
+
+ if (code>=64)
+ p = &spBMBtab0[(code>>5)-2];
+ else if (code>=16)
+ p = &spBMBtab1[(code>>2)-4];
+ else if (code>=8)
+ p = &spBMBtab2[code-8];
+ else
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ Flush_Buffer(p->len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,9,p->len);
+ printf("): %02x\n",p->val);
+ }
+#endif /* TRACE */
+
+ return p->val;
+}
+
+static int Get_SNR_macroblock_type()
+{
+ int code;
+
+#ifdef TRACE /* *CH* */
+ if (Trace_Flag)
+ printf("macroblock_type(SNR) (");
+#endif TRACE
+
+ code = Show_Bits(3);
+
+ if (code==0)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_type code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ Flush_Buffer(SNRMBtab[code].len);
+
+#ifdef TRACE /* *CH* */
+ if (Trace_Flag)
+ {
+ Print_Bits(code,3,SNRMBtab[code].len);
+ printf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
+ }
+#endif TRACE
+
+
+ return SNRMBtab[code].val;
+}
+
+int Get_motion_code()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("motion_code (");
+#endif /* TRACE */
+
+ if (Get_Bits1())
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("0): 0\n");
+#endif /* TRACE */
+ return 0;
+ }
+
+ if ((code = Show_Bits(9))>=64)
+ {
+ code >>= 6;
+ Flush_Buffer(MVtab0[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,3,MVtab0[code].len);
+ printf("%d): %d\n",
+ Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
+ }
+#endif /* TRACE */
+
+ return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
+ }
+
+ if (code>=24)
+ {
+ code >>= 3;
+ Flush_Buffer(MVtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,6,MVtab1[code].len);
+ printf("%d): %d\n",
+ Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
+ }
+#endif /* TRACE */
+
+ return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
+ }
+
+ if ((code-=12)<0)
+ {
+ if (!Quiet_Flag)
+/* HACK */
+ printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
+ Fault_Flag=1;
+ return 0;
+ }
+
+ Flush_Buffer(MVtab2[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code+12,9,MVtab2[code].len);
+ printf("%d): %d\n",
+ Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
+ }
+#endif /* TRACE */
+
+ return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
+}
+
+/* get differential motion vector (for dual prime prediction) */
+int Get_dmvector()
+{
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("dmvector (");
+#endif /* TRACE */
+
+ if (Get_Bits(1))
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
+#endif /* TRACE */
+ return Get_Bits(1) ? -1 : 1;
+ }
+ else
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("0): 0\n");
+#endif /* TRACE */
+ return 0;
+ }
+}
+
+int Get_coded_block_pattern()
+{
+ int code;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("coded_block_pattern_420 (");
+#endif /* TRACE */
+
+ if ((code = Show_Bits(9))>=128)
+ {
+ code >>= 4;
+ Flush_Buffer(CBPtab0[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,5,CBPtab0[code].len);
+ printf("): ");
+ Print_Bits(CBPtab0[code].val,6,6);
+ printf(" (%d)\n",CBPtab0[code].val);
+ }
+#endif /* TRACE */
+
+ return CBPtab0[code].val;
+ }
+
+ if (code>=8)
+ {
+ code >>= 1;
+ Flush_Buffer(CBPtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,8,CBPtab1[code].len);
+ printf("): ");
+ Print_Bits(CBPtab1[code].val,6,6);
+ printf(" (%d)\n",CBPtab1[code].val);
+ }
+#endif /* TRACE */
+
+ return CBPtab1[code].val;
+ }
+
+ if (code<1)
+ {
+ if (!Quiet_Flag)
+ printf("Invalid coded_block_pattern code\n");
+ Fault_Flag = 1;
+ return 0;
+ }
+
+ Flush_Buffer(CBPtab2[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,9,CBPtab2[code].len);
+ printf("): ");
+ Print_Bits(CBPtab2[code].val,6,6);
+ printf(" (%d)\n",CBPtab2[code].val);
+ }
+#endif /* TRACE */
+
+ return CBPtab2[code].val;
+}
+
+int Get_macroblock_address_increment()
+{
+ int code, val;
+
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("macroblock_address_increment (");
+#endif /* TRACE */
+
+ val = 0;
+
+ while ((code = Show_Bits(11))<24)
+ {
+ if (code!=15) /* if not macroblock_stuffing */
+ {
+ if (code==8) /* if macroblock_escape */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("00000001000 ");
+#endif /* TRACE */
+
+ val+= 33;
+ }
+ else
+ {
+ if (!Quiet_Flag)
+ printf("Invalid macroblock_address_increment code\n");
+
+ Fault_Flag = 1;
+ return 1;
+ }
+ }
+ else /* macroblock suffing */
+ {
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("00000001111 ");
+#endif /* TRACE */
+ }
+
+ Flush_Buffer(11);
+ }
+
+ /* macroblock_address_increment == 1 */
+ /* ('1' is in the MSB position of the lookahead) */
+ if (code>=1024)
+ {
+ Flush_Buffer(1);
+#ifdef TRACE
+ if (Trace_Flag)
+ printf("1): %d\n",val+1);
+#endif /* TRACE */
+ return val + 1;
+ }
+
+ /* codes 00010 ... 011xx */
+ if (code>=128)
+ {
+ /* remove leading zeros */
+ code >>= 6;
+ Flush_Buffer(MBAtab1[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code,5,MBAtab1[code].len);
+ printf("): %d\n",val+MBAtab1[code].val);
+ }
+#endif /* TRACE */
+
+
+ return val + MBAtab1[code].val;
+ }
+
+ /* codes 00000011000 ... 0000111xxxx */
+ code-= 24; /* remove common base */
+ Flush_Buffer(MBAtab2[code].len);
+
+#ifdef TRACE
+ if (Trace_Flag)
+ {
+ Print_Bits(code+24,11,MBAtab2[code].len);
+ printf("): %d\n",val+MBAtab2[code].val);
+ }
+#endif /* TRACE */
+
+ return val + MBAtab2[code].val;
+}
+
+/* combined MPEG-1 and MPEG-2 stage. parse VLC and
+ perform dct_diff arithmetic.
+
+ MPEG-1: ISO/IEC 11172-2 section
+ MPEG-2: ISO/IEC 13818-2 section 7.2.1
+
+ Note: the arithmetic here is presented more elegantly than
+ the spec, yet the results, dct_diff, are the same.
+*/
+
+int Get_Luma_DC_dct_diff()
+{
+ int code, size, dct_diff;
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf("dct_dc_size_luminance: (");
+*/
+#endif /* TRACE */
+
+ /* decode length */
+ code = Show_Bits(5);
+
+ if (code<31)
+ {
+ size = DClumtab0[code].val;
+ Flush_Buffer(DClumtab0[code].len);
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ {
+ Print_Bits(code,5,DClumtab0[code].len);
+ printf("): %d",size);
+ }
+*/
+#endif /* TRACE */
+ }
+ else
+ {
+ code = Show_Bits(9) - 0x1f0;
+ size = DClumtab1[code].val;
+ Flush_Buffer(DClumtab1[code].len);
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ {
+ Print_Bits(code+0x1f0,9,DClumtab1[code].len);
+ printf("): %d",size);
+ }
+*/
+#endif /* TRACE */
+ }
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf(", dct_dc_differential (");
+*/
+#endif /* TRACE */
+
+ if (size==0)
+ dct_diff = 0;
+ else
+ {
+ dct_diff = Get_Bits(size);
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ Print_Bits(dct_diff,size,size);
+*/
+#endif /* TRACE */
+ if ((dct_diff & (1<<(size-1)))==0)
+ dct_diff-= (1<<size) - 1;
+ }
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf("): %d\n",dct_diff);
+*/
+#endif /* TRACE */
+
+ return dct_diff;
+}
+
+
+int Get_Chroma_DC_dct_diff()
+{
+ int code, size, dct_diff;
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf("dct_dc_size_chrominance: (");
+*/
+#endif /* TRACE */
+
+ /* decode length */
+ code = Show_Bits(5);
+
+ if (code<31)
+ {
+ size = DCchromtab0[code].val;
+ Flush_Buffer(DCchromtab0[code].len);
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ {
+ Print_Bits(code,5,DCchromtab0[code].len);
+ printf("): %d",size);
+ }
+*/
+#endif /* TRACE */
+ }
+ else
+ {
+ code = Show_Bits(10) - 0x3e0;
+ size = DCchromtab1[code].val;
+ Flush_Buffer(DCchromtab1[code].len);
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ {
+ Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
+ printf("): %d",size);
+ }
+*/
+#endif /* TRACE */
+ }
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf(", dct_dc_differential (");
+*/
+#endif /* TRACE */
+
+ if (size==0)
+ dct_diff = 0;
+ else
+ {
+ dct_diff = Get_Bits(size);
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ Print_Bits(dct_diff,size,size);
+*/
+#endif /* TRACE */
+ if ((dct_diff & (1<<(size-1)))==0)
+ dct_diff-= (1<<size) - 1;
+ }
+
+#ifdef TRACE
+/*
+ if (Trace_Flag)
+ printf("): %d\n",dct_diff);
+*/
+#endif /* TRACE */
+
+ return dct_diff;
+}
Index: branches/pj/mpeg2/todo
===================================================================
--- branches/pj/mpeg2/todo (nonexistent)
+++ branches/pj/mpeg2/todo (revision 1085)
@@ -0,0 +1,73 @@
+ 1. Test bitstream
+ Small example bitstream (128x128 pixel dimensions) which employs all
+ picture_structure (top field, bottom field, frame), picture_coding_type
+ (I, P, and B), macroblock_type (forwards/backwards/interpolated,
+ intra/non-intra, coded/not-coded, quant/no quant, etc.), and
+ motion_type (field, frame, 16X8, dual prime) modes.
+
+ 2. add trace printing for mpeg1 getblk routines.
+
+ 3. modify getsys.c to parse program layer bitstreams (Systems)
+ with variable-length packets.
+
+ 4. 24 bit X11 display
+ (borrow from Berkeley or find way for our code to use their interface)
+
+ 5. MPEG-2 Transport layer systems streams parsing
+
+ 6. Document IPR issue
+
+ provide CableLabs URL
+ how IPR relates to our disclaimer.
+
+ 7. TIFF library support (YCbCr 4:4:4, 4:2:2, and 4:2:0 pictures)
+[deferred]
+
+10. IDCT rounding
+ As per IDCT corridgendum (Savatier, MPEG 95/XXX)
+ [done, but verified ?]
+
+
+12. green dots in can
+ [ appears to be a display issue, probably related to convmat[]
+ error ]
+
+19. move Dual_Prime calculation into picture_data()
+
+20. motion vector calculation to include tappable stages to test
+ whether elements fall within [low:high] range.
+
+21. Integrate verifier routines
+
+22. Inter-layer verification routines
+ - check base and enhancement layers (e.g. SNR)
+
+23. Spatial verification
+ - considering that no base layer is available.
+
+24. SNR verification
+ [ done ]
+
+25. DP verification
+ [ not done. No longer any bitstreams with Data Partitioning distributed
+ since DP is not part of any official Profile ]
+
+26. merge all global bitsteam element variables into
+ common data structure (similar to layer_data). This is needed
+ for the verifier (whether or not headers in SNR and DP streams
+ are identical where needed to that of the base layer).
+
+27. investigate why MS-DOS wants an extra % sign for filename patterns
+ when more than one filename pattern is used in the command line argument
+
+28. convert -t (trace) flag into levels, merge with Verbose.
+
+29. seek to a specified frame number (support for MCI-like functions)
+
+30. document the "flash" VLC table decoding method in detail.
+ (namely how to map tables in Annex B to those in getvlc.h)
+
+31. MPEG-2 program stream compatibility
+ (a few minor bits of difference in the system header ).
+
+--------
Index: branches/pj/mpeg2/makefile.ori
===================================================================
--- branches/pj/mpeg2/makefile.ori (nonexistent)
+++ branches/pj/mpeg2/makefile.ori (revision 1085)
@@ -0,0 +1,98 @@
+# Makefile for mpeg2decode
+
+# Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved.
+
+#
+# Disclaimer of Warranty
+#
+# These software programs are available to the user without any license fee or
+# royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+# any and all warranties, whether express, implied, or statuary, including any
+# implied warranties or merchantability or of fitness for a particular
+# purpose. In no event shall the copyright-holder be liable for any
+# incidental, punitive, or consequential damages of any kind whatsoever
+# arising from the use of these programs.
+#
+# This disclaimer of warranty extends to the user of these programs and user's
+# customers, employees, agents, transferees, successors, and assigns.
+#
+# The MPEG Software Simulation Group does not represent or warrant that the
+# programs furnished hereunder are free of infringement of any third-party
+# patents.
+#
+# Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+# are subject to royalty fees to patent holders. Many of these patents are
+# general enough such that they are unavoidable regardless of implementation
+# design.
+#
+#
+
+#WARNINGS = -Wall
+#VERIFY = -DVERIFY
+
+#disable this flag if you do not want bitstream element tracing
+#this will speed up the decoder some since it does not have to test
+#the trace flag at several critical inner loop locations.
+TRACE = -DTRACE
+
+#disable this flag if you do not need verbose trace, such as
+#header information
+VERBOSE = -DVERBOSE
+
+# uncomment the following two lines if you want to include X11 support
+
+#USE_DISP = -DDISPLAY
+#LIBS = -lX11
+
+# uncomment the following two lines if you want to use shared memory
+# (faster display if server and client run on the same machine)
+
+#USE_SHMEM = -DSH_MEM
+#LIBS = -lXext -lX11
+
+# if your X11 include files / libraries are in a non standard location:
+# set INCLUDEDIR to -I followed by the appropriate include file path and
+# set LIBRARYDIR to -L followed by the appropriate library path and
+
+#INCLUDEDIR = -I/usr/openwin/include
+#LIBRARYDIR = -L/usr/openwin/lib
+
+#
+# GNU gcc
+#
+CC = gcc
+CFLAGS = -O2 $(USE_DISP) $(USE_SHMEM) $(INCLUDEDIR) $(TRACE) $(VERBOSE) $(VERIFY) $(WARNINGS)
+
+OBJ = mpeg2dec.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o display.o systems.o subspic.o verify.o
+
+all: mpeg2decode
+
+pc: mpeg2dec.exe
+
+clean:
+ rm -f *.o *% core mpeg2decode
+
+mpeg2dec.exe: mpeg2decode
+ coff2exe mpeg2dec
+
+mpeg2decode: $(OBJ)
+ $(CC) $(CFLAGS) $(LIBRARYDIR) -o mpeg2decode $(OBJ) -lm $(LIBS)
+
+display.o : display.c config.h global.h mpeg2dec.h
+getbits.o : getbits.c config.h global.h mpeg2dec.h
+getblk.o : getblk.c config.h global.h mpeg2dec.h
+gethdr.o : gethdr.c config.h global.h mpeg2dec.h
+getpic.o : getpic.c config.h global.h mpeg2dec.h
+getvlc.o : getvlc.c config.h global.h mpeg2dec.h getvlc.h
+idct.o : idct.c config.h
+idctref.o : idctref.c config.h
+motion.o : motion.c config.h global.h mpeg2dec.h
+mpeg2dec.o : mpeg2dec.c config.h global.h mpeg2dec.h
+recon.o : recon.c config.h global.h mpeg2dec.h
+spatscal.o : spatscal.c config.h global.h mpeg2dec.h
+store.o : store.c config.h global.h mpeg2dec.h
+
+# additions since July 4, 1994 edition
+systems.o : systems.c config.h global.h mpeg2dec.h
+subspic.o : subspic.c config.h global.h mpeg2dec.h
+verify.o: verify.c config.h global.h mpeg2dec.h
Index: branches/pj/mpeg2/mpeg2dec.c
===================================================================
--- branches/pj/mpeg2/mpeg2dec.c (nonexistent)
+++ branches/pj/mpeg2/mpeg2dec.c (revision 1085)
@@ -0,0 +1,770 @@
+
+/* mpeg2dec.c, main(), initialization, option processing */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+#define GLOBAL
+#include "config.h"
+#include "global.h"
+
+/* private prototypes */
+static int video_sequence _ANSI_ARGS_((int *framenum));
+static int Decode_Bitstream _ANSI_ARGS_((void));
+static int Headers _ANSI_ARGS_((void));
+static void Initialize_Sequence _ANSI_ARGS_((void));
+static void Initialize_Decoder _ANSI_ARGS_((void));
+static void Deinitialize_Sequence _ANSI_ARGS_((void));
+static void Process_Options _ANSI_ARGS_((int argc, char *argv[]));
+
+
+#if OLD
+static int Get_Val _ANSI_ARGS_((char *argv[]));
+#endif
+
+/* #define DEBUG */
+
+static void Clear_Options();
+#ifdef DEBUG
+static void Print_Options();
+#endif
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+ int ret, code;
+
+ Clear_Options();
+
+ /* decode command line arguments */
+ Process_Options(argc,argv);
+
+#ifdef DEBUG
+ Print_Options();
+#endif
+
+ ld = &base; /* select base layer context */
+
+ /* open MPEG base layer bitstream file(s) */
+ /* NOTE: this is either a base layer stream or a spatial enhancement stream */
+ if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
+ {
+ fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename);
+ exit(1);
+ }
+
+
+ if(base.Infile != 0)
+ {
+ Initialize_Buffer();
+
+ if(Show_Bits(8)==0x47)
+ {
+ sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
+ Error(Error_Text);
+ }
+
+ next_start_code();
+ code = Show_Bits(32);
+
+ switch(code)
+ {
+ case SEQUENCE_HEADER_CODE:
+ break;
+ case PACK_START_CODE:
+ System_Stream_Flag = 1;
+ case VIDEO_ELEMENTARY_STREAM:
+ System_Stream_Flag = 1;
+ break;
+ default:
+ sprintf(Error_Text,"Unable to recognize stream type\n");
+ Error(Error_Text);
+ break;
+ }
+
+ lseek(base.Infile, 0l, 0);
+ Initialize_Buffer();
+ }
+
+ if(base.Infile!=0)
+ {
+ lseek(base.Infile, 0l, 0);
+ }
+
+ Initialize_Buffer();
+
+ if(Two_Streams)
+ {
+ ld = &enhan; /* select enhancement layer context */
+
+ if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
+ {
+ sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
+ Enhancement_Layer_Bitstream_Filename);
+
+ Error(Error_Text);
+ }
+
+ Initialize_Buffer();
+ ld = &base;
+ }
+
+ Initialize_Decoder();
+
+ ret = Decode_Bitstream();
+
+ close(base.Infile);
+
+ if (Two_Streams)
+ close(enhan.Infile);
+
+ return 0;
+}
+
+/* IMPLEMENTAION specific rouintes */
+static void Initialize_Decoder()
+{
+ int i;
+
+ /* Clip table */
+ if (!(Clip=(unsigned char *)malloc(1024)))
+ Error("Clip[] malloc failed\n");
+
+ Clip += 384;
+
+ for (i=-384; i<640; i++)
+ Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
+
+ /* IDCT */
+ if (Reference_IDCT_Flag)
+ Initialize_Reference_IDCT();
+ else
+ Initialize_Fast_IDCT();
+
+}
+
+/* mostly IMPLEMENTAION specific rouintes */
+static void Initialize_Sequence()
+{
+ int cc, size;
+ static int Table_6_20[3] = {6,8,12};
+
+ /* check scalability mode of enhancement layer */
+ if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
+ Error("unsupported scalability mode\n");
+
+ /* force MPEG-1 parameters for proper decoder behavior */
+ /* see ISO/IEC 13818-2 section D.9.14 */
+ if (!base.MPEG2_Flag)
+ {
+ progressive_sequence = 1;
+ progressive_frame = 1;
+ picture_structure = FRAME_PICTURE;
+ frame_pred_frame_dct = 1;
+ chroma_format = CHROMA420;
+ matrix_coefficients = 5;
+ }
+
+ /* round to nearest multiple of coded macroblocks */
+ /* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
+ mb_width = (horizontal_size+15)/16;
+ mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
+ : (vertical_size+15)/16;
+
+ Coded_Picture_Width = 16*mb_width;
+ Coded_Picture_Height = 16*mb_height;
+
+ /* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
+ Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
+ : Coded_Picture_Width>>1;
+ Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
+ : Coded_Picture_Height>>1;
+
+ /* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
+ block_count = Table_6_20[chroma_format-1];
+
+ for (cc=0; cc<3; cc++)
+ {
+ if (cc==0)
+ size = Coded_Picture_Width*Coded_Picture_Height;
+ else
+ size = Chroma_Width*Chroma_Height;
+
+ if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
+ Error("backward_reference_frame[] malloc failed\n");
+
+ if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
+ Error("forward_reference_frame[] malloc failed\n");
+
+ if (!(auxframe[cc] = (unsigned char *)malloc(size)))
+ Error("auxframe[] malloc failed\n");
+
+ if(Ersatz_Flag)
+ if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
+ Error("substitute_frame[] malloc failed\n");
+
+
+ if (base.scalable_mode==SC_SPAT)
+ {
+ /* this assumes lower layer is 4:2:0 */
+ if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
+ Error("llframe0 malloc failed\n");
+ if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
+ Error("llframe1 malloc failed\n");
+ }
+ }
+
+ /* SCALABILITY: Spatial */
+ if (base.scalable_mode==SC_SPAT)
+ {
+ if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
+ Error("lltmp malloc failed\n");
+ }
+
+ // PJ
+ Initialize_framebuf( Coded_Picture_Width*Coded_Picture_Height*sizeof(WORD) );
+ gvideo_init();
+ init_jetcontrol();
+
+#ifdef DISPLAY
+ if (Output_Type==T_X11)
+ {
+ Initialize_Display_Process("");
+ Initialize_Dither_Matrix();
+ }
+#endif /* DISPLAY */
+
+}
+
+void Error(text)
+char *text;
+{
+ fprintf(stderr,text);
+ exit(1);
+}
+
+/* Trace_Flag output */
+void Print_Bits(code,bits,len)
+int code,bits,len;
+{
+ int i;
+ for (i=0; i<len; i++)
+ printf("%d",(code>>(bits-1-i))&1);
+}
+
+
+
+/* option processing */
+static void Process_Options(argc,argv)
+int argc; /* argument count */
+char *argv[]; /* argument vector */
+{
+ int i, LastArg, NextArg;
+
+ /* at least one argument should be present */
+ if (argc<2)
+ {
+ printf("\n%s, %s\n",Version,Author);
+ printf("Usage: mpeg2decode {options}\n\
+Options: -b file main bitstream (base or spatial enhancement layer)\n\
+ -cn file conformance report (n: level)\n\
+ -e file enhancement layer bitstream (SNR or Data Partitioning)\n\
+ -f store/display interlaced video in frame format\n\
+ -g concatenated file format for substitution method (-x)\n\
+ -in file information & statistics report (n: level)\n\
+ -l file file name pattern for lower layer sequence\n\
+ (for spatial scalability)\n\
+ -on file output format (0:YUV 1:SIF 2:TGA 3:PPM 4:X11 5:X11HiQ)\n\
+ -q disable warnings to stderr\n\
+ -r use double precision reference IDCT\n\
+ -t enable low level tracing to stdout\n\
+ -u file print user_data to stdio or file\n\
+ -vn verbose output (n: level)\n\
+ -x file filename pattern of picture substitution sequence\n\n\
+File patterns: for sequential filenames, \"printf\" style, e.g. rec%%d\n\
+ or rec%%d%%c for fieldwise storage\n\
+Levels: 0:none 1:sequence 2:picture 3:slice 4:macroblock 5:block\n\n\
+Example: mpeg2decode -b bitstream.mpg -f -r -o0 rec%%d\n\
+ \n");
+ exit(0);
+ }
+
+
+ Output_Type = -1;
+ i = 1;
+
+ /* command-line options are proceeded by '-' */
+
+ while(i < argc)
+ {
+ /* check if this is the last argument */
+ LastArg = ((argc-i)==1);
+
+ /* parse ahead to see if another flag immediately follows current
+ argument (this is used to tell if a filename is missing) */
+ if(!LastArg)
+ NextArg = (argv[i+1][0]=='-');
+ else
+ NextArg = 0;
+
+ /* second character, [1], after '-' is the switch */
+ if(argv[i][0]=='-')
+ {
+ switch(toupper(argv[i][1]))
+ {
+ /* third character. [2], is the value */
+ case 'B':
+ Main_Bitstream_Flag = 1;
+
+ if(NextArg || LastArg)
+ {
+ printf("ERROR: -b must be followed the main bitstream filename\n");
+ }
+ else
+ Main_Bitstream_Filename = argv[++i];
+
+ break;
+
+
+ case 'C':
+
+#ifdef VERIFY
+ Verify_Flag = atoi(&argv[i][2]);
+
+ if((Verify_Flag < NO_LAYER) || (Verify_Flag > ALL_LAYERS))
+ {
+ printf("ERROR: -c level (%d) out of range [%d,%d]\n",
+ Verify_Flag, NO_LAYER, ALL_LAYERS);
+ exit(ERROR);
+ }
+#else /* VERIFY */
+ printf("This program not compiled for Verify_Flag option\n");
+#endif /* VERIFY */
+ break;
+
+ case 'E':
+ Two_Streams = 1; /* either Data Partitioning (DP) or SNR Scalability enhancment */
+
+ if(NextArg || LastArg)
+ {
+ printf("ERROR: -e must be followed by filename\n");
+ exit(ERROR);
+ }
+ else
+ Enhancement_Layer_Bitstream_Filename = argv[++i];
+
+ break;
+
+
+ case 'F':
+ Frame_Store_Flag = 1;
+ break;
+
+ case 'G':
+ Big_Picture_Flag = 1;
+ break;
+
+
+ case 'I':
+#ifdef VERIFY
+ Stats_Flag = atoi(&argv[i][2]);
+#else /* VERIFY */
+ printf("WARNING: This program not compiled for -i option\n");
+#endif /* VERIFY */
+ break;
+
+ case 'L': /* spatial scalability flag */
+ Spatial_Flag = 1;
+
+ if(NextArg || LastArg)
+ {
+ printf("ERROR: -l must be followed by filename\n");
+ exit(ERROR);
+ }
+ else
+ Lower_Layer_Picture_Filename = argv[++i];
+
+ break;
+
+ case 'O':
+
+ Output_Type = atoi(&argv[i][2]);
+
+ if((Output_Type==4) || (Output_Type==5))
+ Output_Picture_Filename = ""; /* no need of filename */
+ else if(NextArg || LastArg)
+ {
+ printf("ERROR: -o must be followed by filename\n");
+ exit(ERROR);
+ }
+ else
+ /* filename is separated by space, so it becomes the next argument */
+ Output_Picture_Filename = argv[++i];
+
+#ifdef DISPLAY
+ if (Output_Type==T_X11HIQ)
+ {
+ hiQdither = 1;
+ Output_Type=T_X11;
+ }
+#endif /* DISPLAY */
+ break;
+
+ case 'Q':
+ Quiet_Flag = 1;
+ break;
+
+ case 'R':
+ Reference_IDCT_Flag = 1;
+ break;
+
+ case 'T':
+#ifdef TRACE
+ Trace_Flag = 1;
+#else /* TRACE */
+ printf("WARNING: This program not compiled for -t option\n");
+#endif /* TRACE */
+ break;
+
+ case 'U':
+ User_Data_Flag = 1;
+
+ case 'V':
+#ifdef VERBOSE
+ Verbose_Flag = atoi(&argv[i][2]);
+#else /* VERBOSE */
+ printf("This program not compiled for -v option\n");
+#endif /* VERBOSE */
+ break;
+
+
+ case 'X':
+ Ersatz_Flag = 1;
+
+ if(NextArg || LastArg)
+ {
+ printf("ERROR: -x must be followed by filename\n");
+ exit(ERROR);
+ }
+ else
+ Substitute_Picture_Filename = argv[++i];
+
+ break;
+
+
+
+ default:
+ fprintf(stderr,"undefined option -%c ignored. Exiting program\n",
+ argv[i][1]);
+
+ exit(ERROR);
+
+ } /* switch() */
+ } /* if argv[i][0] == '-' */
+
+ i++;
+
+ /* check for bitstream filename argument (there must always be one, at the very end
+ of the command line arguments */
+
+ } /* while() */
+
+
+ /* options sense checking */
+
+ if(Main_Bitstream_Flag!=1)
+ {
+ printf("There must be a main bitstream specified (-b filename)\n");
+ }
+
+ /* force display process to show frame pictures */
+ if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
+ Display_Progressive_Flag = 1;
+ else
+ Display_Progressive_Flag = 0;
+
+#ifdef VERIFY
+ /* parse the bitstream, do not actually decode it completely */
+
+
+#if 0
+ if(Output_Type==-1)
+ {
+ Decode_Layer = Verify_Flag;
+ printf("FYI: Decoding bitstream elements up to: %s\n",
+ Layer_Table[Decode_Layer]);
+ }
+ else
+#endif
+ Decode_Layer = ALL_LAYERS;
+
+#endif /* VERIFY */
+
+ /* no output type specified */
+ if(Output_Type==-1)
+ {
+ Output_Type = 9;
+ Output_Picture_Filename = "";
+ }
+
+
+#ifdef DISPLAY
+ if (Output_Type==T_X11)
+ {
+ if(Frame_Store_Flag)
+ Display_Progressive_Flag = 1;
+ else
+ Display_Progressive_Flag = 0;
+
+ Frame_Store_Flag = 1; /* to avoid calling dither() twice */
+ }
+#endif
+
+
+}
+
+
+#ifdef OLD
+/*
+ this is an old routine used to convert command line arguments
+ into integers
+*/
+static int Get_Val(argv)
+char *argv[];
+{
+ int val;
+
+ if (sscanf(argv[1]+2,"%d",&val)!=1)
+ return 0;
+
+ while (isdigit(argv[1][2]))
+ argv[1]++;
+
+ return val;
+}
+#endif
+
+
+
+static int Headers()
+{
+ int ret;
+
+ ld = &base;
+
+
+ /* return when end of sequence (0) or picture
+ header has been parsed (1) */
+
+ ret = Get_Hdr();
+
+
+ if (Two_Streams)
+ {
+ ld = &enhan;
+ if (Get_Hdr()!=ret && !Quiet_Flag)
+ fprintf(stderr,"streams out of sync\n");
+ ld = &base;
+ }
+
+ return ret;
+}
+
+
+
+static int Decode_Bitstream()
+{
+ int ret;
+ int Bitstream_Framenum;
+
+ Bitstream_Framenum = 0;
+
+ for(;;)
+ {
+
+#ifdef VERIFY
+ Clear_Verify_Headers();
+#endif /* VERIFY */
+
+ ret = Headers();
+
+ if(ret==1)
+ {
+ ret = video_sequence(&Bitstream_Framenum);
+ }
+ else
+ return(ret);
+ }
+
+}
+
+
+static void Deinitialize_Sequence()
+{
+ int i;
+
+ /* clear flags */
+ base.MPEG2_Flag=0;
+
+ for(i=0;i<3;i++)
+ {
+ free(backward_reference_frame[i]);
+ free(forward_reference_frame[i]);
+ free(auxframe[i]);
+
+ if (base.scalable_mode==SC_SPAT)
+ {
+ free(llframe0[i]);
+ free(llframe1[i]);
+ }
+ }
+
+ if (base.scalable_mode==SC_SPAT)
+ free(lltmp);
+
+#ifdef DISPLAY
+ if (Output_Type==T_X11)
+ Terminate_Display_Process();
+#endif
+}
+
+
+static int video_sequence(Bitstream_Framenumber)
+int *Bitstream_Framenumber;
+{
+ int Bitstream_Framenum;
+ int Sequence_Framenum;
+ int Return_Value;
+
+ Bitstream_Framenum = *Bitstream_Framenumber;
+ Sequence_Framenum=0;
+
+ Initialize_Sequence();
+
+ /* decode picture whose header has already been parsed in
+ Decode_Bitstream() */
+
+
+ Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
+
+ /* update picture numbers */
+ if (!Second_Field)
+ {
+ Bitstream_Framenum++;
+ Sequence_Framenum++;
+ }
+
+ /* loop through the rest of the pictures in the sequence */
+ while ((Return_Value=Headers()))
+ {
+ Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
+
+ if (!Second_Field)
+ {
+ Bitstream_Framenum++;
+ Sequence_Framenum++;
+ }
+ }
+
+ /* put last frame */
+ if (Sequence_Framenum!=0)
+ {
+ Output_Last_Frame_of_Sequence(Bitstream_Framenum);
+ }
+
+ Deinitialize_Sequence();
+
+#ifdef VERIFY
+ Clear_Verify_Headers();
+#endif /* VERIFY */
+
+ *Bitstream_Framenumber = Bitstream_Framenum;
+ return(Return_Value);
+}
+
+
+
+static void Clear_Options()
+{
+ Verbose_Flag = 0;
+ Output_Type = 0;
+ Output_Picture_Filename = " ";
+ hiQdither = 0;
+ Output_Type = 0;
+ Frame_Store_Flag = 0;
+ Spatial_Flag = 0;
+ Lower_Layer_Picture_Filename = " ";
+ Reference_IDCT_Flag = 0;
+ Trace_Flag = 0;
+ Quiet_Flag = 0;
+ Ersatz_Flag = 0;
+ Substitute_Picture_Filename = " ";
+ Two_Streams = 0;
+ Enhancement_Layer_Bitstream_Filename = " ";
+ Big_Picture_Flag = 0;
+ Main_Bitstream_Flag = 0;
+ Main_Bitstream_Filename = " ";
+ Verify_Flag = 0;
+ Stats_Flag = 0;
+ User_Data_Flag = 0;
+}
+
+
+#ifdef DEBUG
+static void Print_Options()
+{
+
+ printf("Verbose_Flag = %d\n", Verbose_Flag);
+ printf("Output_Type = %d\n", Output_Type);
+ printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
+ printf("hiQdither = %d\n", hiQdither);
+ printf("Output_Type = %d\n", Output_Type);
+ printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
+ printf("Spatial_Flag = %d\n", Spatial_Flag);
+ printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
+ printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
+ printf("Trace_Flag = %d\n", Trace_Flag);
+ printf("Quiet_Flag = %d\n", Quiet_Flag);
+ printf("Ersatz_Flag = %d\n", Ersatz_Flag);
+ printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
+ printf("Two_Streams = %d\n", Two_Streams);
+ printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
+ printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
+ printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
+ printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
+ printf("Verify_Flag = %d\n", Verify_Flag);
+ printf("Stats_Flag = %d\n", Stats_Flag);
+ printf("User_Data_Flag = %d\n", User_Data_Flag);
+
+}
+#endif
Index: branches/pj/mpeg2/changes
===================================================================
--- branches/pj/mpeg2/changes (nonexistent)
+++ branches/pj/mpeg2/changes (revision 1085)
@@ -0,0 +1,95 @@
+CHANGES
+----------
+
+January 9, 1996 to July 17, 1996
+- cleaned up some code which gave warnings.
+- altered some code to be compatible with Sun CC compiler.
+ However, support in the makefile for non-ansi C compilers
+ has been dropped (this is a stupid thing to support).
+
+December 20, 1995 to January 9, 1996:
+
+verified on HHI #22, TCEH #23 bitstreams.
+
+ 1. new arguments format. Got to be so many argument fields that
+ a new more consistent format was devised.
+
+ 2. Frame_Store_Flag (-f) option now controls lower layer prediciton
+ picture format (field or framewise)
+
+ 3. getpic() structural changes
+
+
+Since December 18, 1995:
+
+1. added special case for current B pictures subsframe.c which
+ loads entire reference frame for buffer substitution.
+
+2. fixed -l omission (-lXext) in Makefile that drives Tristan nuts everytime.
+
+
+Since December 14, 1995:
+
+ 1. organized frame buffer substitution routines into subspic.c
+ 2. added "big file" -b mode for Tristan ;-)
+
+
+Since July 4, 1994:
+
+1. Concatenated elementary sequences within same bitstream
+
+ Decode can now handle concatenated elementary video sequences of
+ arbitrary parameters.
+
+2. TRACE and VERBOSE #ifdef flags
+
+3. More disciplined naming convention
+
+ normative variables and bitstream elements defined in 13818 are
+ verbatim, lower case. Implementation specific routines and variables
+ are capitolized.
+
+4. Spatial scalability corrections
+ - see Carsten's document (spatscal.doc)
+
+5. D-pictures (picture_coding_type==D_TYPE)
+
+ Only two small changes were necessary to accomodate D-pictures:
+
+ a. in Decode_MPEG1_Intra_Block() added line which termines
+ subroutine after DC coefficient has been processed.
+
+ b. in picture_data(), added line which parses marker bit.
+
+
+ 6. forced decoder to display frame progressively (regardless of whether
+ the picture is frame structured or field structured) when -f flag
+ is invoked in the command line arguements.
+
+ also: progressive_frame now decides whether a frame is to be displayed
+ as a frame picture to two field pictures, rather than the older convention
+ of testing progressive_sequence.
+
+ 7. Adapted systems parser from Stefan's mpeg2play to mpeg2decode.
+ The major changes are:
+
+ mpeg2dec.c:
+ - fseek() called twice
+
+ gethdr.c, getpic.c:
+ instances of Flush_Bits(par,32) changed to Flush_Bits32(par)
+
+ gethdr.c
+ Get_Bits(par,32) changed to Get_32_Bits(par)
+
+ global.h
+ added rdmax, sysstream, and bfr[] to parameters struct.
+
+ 8. Restructuring of getpic.c:
+
+ a. moved picture pointer rotation into Update_Picture_Buffers()
+ b. moved picture output logic into Output_Current_Frame() to
+ in anticipation of 3:2 pulldown
+
+
+
Index: branches/pj/mpeg2/getvlc.h
===================================================================
--- branches/pj/mpeg2/getvlc.h (nonexistent)
+++ branches/pj/mpeg2/getvlc.h (revision 1085)
@@ -0,0 +1,491 @@
+/* getvlc.h, variable length code tables */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
+ as per C programming convention. However, the MPEG document
+ (ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
+
+/* NOTE: the VLC tables are in a flash format---a transformation
+ of the tables in Annex B to a form more convenient towards
+ parallel (more than one-bit-at-a-time) decoding */
+
+typedef struct {
+ char val, len;
+} VLCtab;
+
+typedef struct {
+ char run, level, len;
+} DCTtab;
+
+/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
+static VLCtab PMBtab0[8] = {
+ {ERROR,0},
+ {MACROBLOCK_MOTION_FORWARD,3},
+ {MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
+};
+
+/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
+static VLCtab PMBtab1[8] = {
+ {ERROR,0},
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
+ {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
+ {MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
+};
+
+/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
+static VLCtab BMBtab0[16] = {
+ {ERROR,0},
+ {ERROR,0},
+ {MACROBLOCK_MOTION_FORWARD,4},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
+ {MACROBLOCK_MOTION_BACKWARD,3},
+ {MACROBLOCK_MOTION_BACKWARD,3},
+ {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
+ {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
+};
+
+/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
+static VLCtab BMBtab1[8] = {
+ {ERROR,0},
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
+ {MACROBLOCK_INTRA,5},
+ {MACROBLOCK_INTRA,5}
+};
+
+/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
+static VLCtab spIMBtab[16] = {
+ {ERROR,0},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
+ {MACROBLOCK_INTRA,4},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
+};
+
+/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
+static VLCtab spPMBtab0[16] =
+{
+ {ERROR,0},
+ {ERROR,0},
+ {MACROBLOCK_MOTION_FORWARD,4},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
+};
+
+/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
+static VLCtab spPMBtab1[16] = {
+ {ERROR,0},
+ {ERROR,0},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
+ {MACROBLOCK_PATTERN,7},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
+ {MACROBLOCK_INTRA,7},
+ {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
+ {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
+};
+
+/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
+static VLCtab spBMBtab0[14] = {
+ {MACROBLOCK_MOTION_FORWARD,4},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
+ {MACROBLOCK_MOTION_BACKWARD,3},
+ {MACROBLOCK_MOTION_BACKWARD,3},
+ {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
+ {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
+};
+
+/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
+static VLCtab spBMBtab1[12] = {
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
+ {MACROBLOCK_INTRA,7},
+ {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
+};
+
+/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
+static VLCtab spBMBtab2[8] = {
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
+ {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
+ {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
+ {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
+};
+
+/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
+static VLCtab SNRMBtab[8] = {
+ {ERROR,0},
+ {0,3},
+ {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
+ {MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_PATTERN,1},
+ {MACROBLOCK_PATTERN,1}
+};
+
+/* Table B-10, motion_code, codes 0001 ... 01xx */
+static VLCtab MVtab0[8] =
+{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
+};
+
+/* Table B-10, motion_code, codes 0000011 ... 000011x */
+static VLCtab MVtab1[8] =
+{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
+};
+
+/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
+static VLCtab MVtab2[12] =
+{ {16,9}, {15,9}, {14,9}, {13,9},
+ {12,9}, {11,9}, {10,8}, {10,8},
+ {9,8}, {9,8}, {8,8}, {8,8}
+};
+
+/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
+static VLCtab CBPtab0[32] =
+{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
+ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
+ {62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
+ {40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
+ {8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
+};
+
+/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
+static VLCtab CBPtab1[64] =
+{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
+ {58,8}, {54,8}, {46,8}, {30,8},
+ {57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
+ {43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
+ {41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
+ {34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
+ {33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
+ {63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
+ {36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
+};
+
+/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
+static VLCtab CBPtab2[8] =
+{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
+};
+
+/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
+static VLCtab MBAtab1[16] =
+{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
+ {3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
+};
+
+/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
+static VLCtab MBAtab2[104] =
+{
+ {33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
+ {25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
+ {19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
+ {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
+ {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
+ {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
+ {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
+ {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
+ {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
+ {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
+ {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
+ {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
+ {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
+};
+
+/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
+static VLCtab DClumtab0[32] =
+{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
+ {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
+ {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
+ {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
+};
+
+/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
+static VLCtab DClumtab1[16] =
+{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
+ {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
+};
+
+/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
+static VLCtab DCchromtab0[32] =
+{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
+ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
+ {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
+ {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
+};
+
+/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
+static VLCtab DCchromtab1[32] =
+{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
+ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
+ {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
+ {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
+};
+
+/* Table B-14, DCT coefficients table zero,
+ * codes 0100 ... 1xxx (used for first (DC) coefficient)
+ */
+DCTtab DCTtabfirst[12] =
+{
+ {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
+ {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
+ {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
+};
+
+/* Table B-14, DCT coefficients table zero,
+ * codes 0100 ... 1xxx (used for all other coefficients)
+ */
+DCTtab DCTtabnext[12] =
+{
+ {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
+ {64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
+};
+
+/* Table B-14, DCT coefficients table zero,
+ * codes 000001xx ... 00111xxx
+ */
+DCTtab DCTtab0[60] =
+{
+ {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
+ {2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
+ {0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
+ {7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
+ {6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
+ {1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
+ {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
+ {13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
+ {3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
+ {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
+ {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
+ {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
+ {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
+ {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
+ {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
+};
+
+/* Table B-15, DCT coefficients table one,
+ * codes 000001xx ... 11111111
+*/
+DCTtab DCTtab0a[252] =
+{
+ {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
+ {7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
+ {6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
+ {0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
+ {0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
+ {4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
+ {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
+ {1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
+ {13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
+ {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
+ {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
+ {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
+ {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
+ {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
+ {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
+ {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
+ {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
+ {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
+ {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
+ {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
+ {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
+ {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
+ {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
+ {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
+ {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
+ {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
+ {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
+ {9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
+ {10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
+ {0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
+ {2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
+};
+
+/* Table B-14, DCT coefficients table zero,
+ * codes 0000001000 ... 0000001111
+ */
+DCTtab DCTtab1[8] =
+{
+ {16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
+ {1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
+};
+
+/* Table B-15, DCT coefficients table one,
+ * codes 000000100x ... 000000111x
+ */
+DCTtab DCTtab1a[8] =
+{
+ {5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
+ {2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+ * codes 000000010000 ... 000000011111
+ */
+DCTtab DCTtab2[16] =
+{
+ {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
+ {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
+ {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
+ {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+ * codes 0000000010000 ... 0000000011111
+ */
+DCTtab DCTtab3[16] =
+{
+ {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
+ {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
+ {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
+ {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+ * codes 00000000010000 ... 00000000011111
+ */
+DCTtab DCTtab4[16] =
+{
+ {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
+ {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
+ {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
+ {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+ * codes 000000000010000 ... 000000000011111
+ */
+DCTtab DCTtab5[16] =
+{
+ {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
+ {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
+ {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
+ {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+ * codes 0000000000010000 ... 0000000000011111
+ */
+DCTtab DCTtab6[16] =
+{
+ {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
+ {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
+ {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
+ {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
+};
+
Index: branches/pj/mpeg2/const.h
===================================================================
--- branches/pj/mpeg2/const.h (nonexistent)
+++ branches/pj/mpeg2/const.h (revision 1085)
@@ -0,0 +1,141 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:45 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Useful constants */
+/* ------------------ */
+
+#ifndef __CONST_H_
+
+#define __CONST_H_
+
+/* Screen dimensions */
+#define SCREEN_WIDTH 800
+#define SCREEN_HEIGHT 600
+#define SCREEN_BIT_COLORS 8
+
+/* Visible area */
+#define TEL_WIDTH 50
+#define TEL_HEIGHT 50
+
+/* Car dimensions */
+#define CAR_WIDTH 12
+#define CAR_HEIGHT 12
+#define CAR_W 8
+#define CAR_H 10
+
+/* Track dimensions */
+#define TRACK_WIDTH 500
+#define TRACK_HEIGHT 500
+
+/* Track position */
+#define TRACK_X1 0
+#define TRACK_Y1 0
+#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
+#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
+
+/* Max number of car on track */
+#define MAX_CAR_NUMBER 10
+#define DRIVERS_NUMBER 20
+#define MAX_DRIVER_NAME_LENGTH 20
+#define MAX_TRACK_NAME_LENGTH 20
+#define TRACK_NUMBER 4
+
+/* Lap direction */
+#define CLOCK 0
+#define ANTICLOCK 1
+
+/* Information display coords */
+#define CMD_WIDTH TRACK_WIDTH
+#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
+
+/* Car position limits */
+#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
+#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
+#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
+#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
+
+/* Road constants */
+#define LEFT_ONLY 10
+#define RIGHT_ONLY 11
+#define ROAD_OK 12
+#define NO_ROAD 13
+
+/* Collision constants */
+#define COLLISION_LEFT 20
+#define COLLISION_RIGHT 21
+#define COLLISION_BACK 22
+#define NO_COLL 0
+
+/* CAB constants */
+#define ROAD_MSG_DIM sizeof(road_info)
+#define ROAD_MSG_READER 4
+
+#define CAR_MSG_DIM sizeof(car_status)
+#define CAR_MSG_READER 5
+
+/* Tasks parameters */
+#define SENSOR_WCET 3000
+#define SENSOR_PERIOD 40000
+#define CONTROL_WCET 1000
+#define CONTROL_PERIOD 40000
+
+#endif
+
Index: branches/pj/mpeg2/mpeg2dec.h
===================================================================
--- branches/pj/mpeg2/mpeg2dec.h (nonexistent)
+++ branches/pj/mpeg2/mpeg2dec.h (revision 1085)
@@ -0,0 +1,129 @@
+/* mpeg2dec.h, MPEG specific defines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#define ERROR (-1)
+
+#define PICTURE_START_CODE 0x100
+#define SLICE_START_CODE_MIN 0x101
+#define SLICE_START_CODE_MAX 0x1AF
+#define USER_DATA_START_CODE 0x1B2
+#define SEQUENCE_HEADER_CODE 0x1B3
+#define SEQUENCE_ERROR_CODE 0x1B4
+#define EXTENSION_START_CODE 0x1B5
+#define SEQUENCE_END_CODE 0x1B7
+#define GROUP_START_CODE 0x1B8
+#define SYSTEM_START_CODE_MIN 0x1B9
+#define SYSTEM_START_CODE_MAX 0x1FF
+
+#define ISO_END_CODE 0x1B9
+#define PACK_START_CODE 0x1BA
+#define SYSTEM_START_CODE 0x1BB
+
+#define VIDEO_ELEMENTARY_STREAM 0x1e0
+
+/* scalable_mode */
+#define SC_NONE 0
+#define SC_DP 1
+#define SC_SPAT 2
+#define SC_SNR 3
+#define SC_TEMP 4
+
+/* picture coding type */
+#define I_TYPE 1
+#define P_TYPE 2
+#define B_TYPE 3
+#define D_TYPE 4
+
+/* picture structure */
+#define TOP_FIELD 1
+#define BOTTOM_FIELD 2
+#define FRAME_PICTURE 3
+
+/* macroblock type */
+#define MACROBLOCK_INTRA 1
+#define MACROBLOCK_PATTERN 2
+#define MACROBLOCK_MOTION_BACKWARD 4
+#define MACROBLOCK_MOTION_FORWARD 8
+#define MACROBLOCK_QUANT 16
+#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
+#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
+
+
+/* motion_type */
+#define MC_FIELD 1
+#define MC_FRAME 2
+#define MC_16X8 2
+#define MC_DMV 3
+
+/* mv_format */
+#define MV_FIELD 0
+#define MV_FRAME 1
+
+/* chroma_format */
+#define CHROMA420 1
+#define CHROMA422 2
+#define CHROMA444 3
+
+/* extension start code IDs */
+
+#define SEQUENCE_EXTENSION_ID 1
+#define SEQUENCE_DISPLAY_EXTENSION_ID 2
+#define QUANT_MATRIX_EXTENSION_ID 3
+#define COPYRIGHT_EXTENSION_ID 4
+#define SEQUENCE_SCALABLE_EXTENSION_ID 5
+#define PICTURE_DISPLAY_EXTENSION_ID 7
+#define PICTURE_CODING_EXTENSION_ID 8
+#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
+#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
+
+#define ZIG_ZAG 0
+
+#define PROFILE_422 (128+5)
+#define MAIN_LEVEL 8
+
+/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
+#define NO_LAYER 0
+#define SEQUENCE_LAYER 1
+#define PICTURE_LAYER 2
+#define SLICE_LAYER 3
+#define MACROBLOCK_LAYER 4
+#define BLOCK_LAYER 5
+#define EVENT_LAYER 6
+#define ALL_LAYERS 7
+
+
+
+#define FILENAME_LENGTH 256
+
+
+
+
+#define MB_WEIGHT 32
+#define MB_CLASS4 64
+
Index: branches/pj/mpeg2/store.c
===================================================================
--- branches/pj/mpeg2/store.c (nonexistent)
+++ branches/pj/mpeg2/store.c (revision 1085)
@@ -0,0 +1,529 @@
+/* store.c, picture output routines */
+
+/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
+
+/*
+ * Disclaimer of Warranty
+ *
+ * These software programs are available to the user without any license fee or
+ * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
+ * any and all warranties, whether express, implied, or statuary, including any
+ * implied warranties or merchantability or of fitness for a particular
+ * purpose. In no event shall the copyright-holder be liable for any
+ * incidental, punitive, or consequential damages of any kind whatsoever
+ * arising from the use of these programs.
+ *
+ * This disclaimer of warranty extends to the user of these programs and user's
+ * customers, employees, agents, transferees, successors, and assigns.
+ *
+ * The MPEG Software Simulation Group does not represent or warrant that the
+ * programs furnished hereunder are free of infringement of any third-party
+ * patents.
+ *
+ * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
+ * are subject to royalty fees to patent holders. Many of these patents are
+ * general enough such that they are unavoidable regardless of implementation
+ * design.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "global.h"
+#include "semaphore.h"
+#include "kernel/kern.h"
+
+//#debug DEBUG_MAILBOX
+
+static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
+static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
+
+__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
+{
+ return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
+}
+
+#if 0
+void xWrite_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
+{
+ int i, j;
+ int y, u, v, r, g, b;
+// int rm=0,gm=0,bm=0;
+ int crv, cbu, cgu, cgv;
+ unsigned char *py, *pu, *pv;
+ int height, width;
+
+ struct framebuf_struct *f;
+
+ cprintf("%d ",frame);
+
+ width = Coded_Picture_Width ;
+ height= Coded_Picture_Height;
+
+ f = get_free_framebuf();
+
+ dither(src);
+ f->f[i*width+j] = down32to16(r,g,b);
+
+ f->n = frame;
+ insert_frame(f);
+}
+#endif
+
+void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
+{
+ int i, j;
+ int y, u, v, r, g, b;
+// int rm=0,gm=0,bm=0;
+ int crv, cbu, cgu, cgv;
+ unsigned char *py, *pu, *pv;
+ int height, width, incr;
+ static unsigned char *u422, *v422, *u444, *v444;
+
+ struct framebuf_struct *f;
+
+ cprintf("%d ",frame);
+
+ incr = width = Coded_Picture_Width ;
+ height= Coded_Picture_Height;
+
+ if (chroma_format==CHROMA444)
+ {
+ u444 = src[1];
+ v444 = src[2];
+ }
+ else
+ {
+ if (!u444)
+ {
+ if (chroma_format==CHROMA420)
+ {
+ if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ }
+
+ if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+
+ if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
+ *Coded_Picture_Height)))
+ Error("malloc failed");
+ }
+
+ if (chroma_format==CHROMA420)
+ {
+ conv420to422(src[1],u422);
+ conv420to422(src[2],v422);
+ conv422to444(u422,u444);
+ conv422to444(v422,v444);
+ }
+ else
+ {
+ conv422to444(src[1],u444);
+ conv422to444(src[2],v444);
+ }
+ }
+
+
+ f = get_free_framebuf();
+
+ /* matrix coefficients */
+ crv = Inverse_Table_6_9[matrix_coefficients][0];
+ cbu = Inverse_Table_6_9[matrix_coefficients][1];
+ cgu = Inverse_Table_6_9[matrix_coefficients][2];
+ cgv = Inverse_Table_6_9[matrix_coefficients][3];
+
+ for (i=0; i<height; i++)
+ {
+ py = src[0] + incr*i;
+ pu = u444 + incr*i;
+ pv = v444 + incr*i;
+
+ for (j=0; j<width; j++)
+ {
+ u = *pu++ - 128;
+ v = *pv++ - 128;
+ y = 76309 * (*py++ - 16); /* (255/219)*65536 */
+
+ r = Clip[(y + crv*v + 32768)>>16];
+ g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
+ b = Clip[(y + cbu*u + 32786)>>16];
+
+// rm = max(rm,r);gm=max(gm,g);bm=max(bm,b);
+// cprintf("(r%dg%db%d)",rm,gm,bm);
+ f->f[i*width+j] = down32to16(r,g,b);
+// r=g=b=rand()%255;
+// f->f[i*width+j] = down32to16(r,g,b);
+ }
+ }
+
+ f->n = frame;
+ insert_frame(f);
+}
+
+/*
+void Display_Image(Dithered_Image)
+unsigned char *Dithered_Image;
+{
+ / * display dithered image */
+//}
+
+
+/* horizontal 1:2 interpolation filter */
+static void conv422to444(src,dst)
+unsigned char *src,*dst;
+{
+ int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
+
+ w = Coded_Picture_Width>>1;
+
+ if (base.MPEG2_Flag)
+ {
+ for (j=0; j<Coded_Picture_Height; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+ i2 = i<<1;
+ im2 = (i<2) ? 0 : i-2;
+ im1 = (i<1) ? 0 : i-1;
+ ip1 = (i<w-1) ? i+1 : w-1;
+ ip2 = (i<w-2) ? i+2 : w-1;
+ ip3 = (i<w-3) ? i+3 : w-1;
+
+ /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
+ /* even samples (0 0 256 0 0) */
+ dst[i2] = src[i];
+
+ /* odd samples (21 -52 159 159 -52 21) */
+ dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
+ -52*(src[im1]+src[ip2])
+ +159*(src[i]+src[ip1])+128)>>8];
+ }
+ src+= w;
+ dst+= Coded_Picture_Width;
+ }
+ }
+ else
+ {
+ for (j=0; j<Coded_Picture_Height; j++)
+ {
+ for (i=0; i<w; i++)
+ {
+
+ i2 = i<<1;
+ im3 = (i<3) ? 0 : i-3;
+ im2 = (i<2) ? 0 : i-2;
+ im1 = (i<1) ? 0 : i-1;
+ ip1 = (i<w-1) ? i+1 : w-1;
+ ip2 = (i<w-2) ? i+2 : w-1;
+ ip3 = (i<w-3) ? i+3 : w-1;
+
+ /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
+ dst[i2] = Clip[(int)( 5*src[im3]
+ -21*src[im2]
+ +70*src[im1]
+ +228*src[i]
+ -37*src[ip1]
+ +11*src[ip2]+128)>>8];
+
+ dst[i2+1] = Clip[(int)( 5*src[ip3]
+ -21*src[ip2]
+ +70*src[ip1]
+ +228*src[i]
+ -37*src[im1]
+ +11*src[im2]+128)>>8];
+ }
+ src+= w;
+ dst+= Coded_Picture_Width;
+ }
+ }
+}
+
+/* vertical 1:2 interpolation filter */
+static void conv420to422(src,dst)
+unsigned char *src,*dst;
+{
+ int w, h, i, j, j2;
+ int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
+
+ w = Coded_Picture_Width>>1;
+ h = Coded_Picture_Height>>1;
+
+ if (progressive_frame)
+ {
+ /* intra frame */
+ for (i=0; i<w; i++)
+ {
+ for (j=0; j<h; j++)
+ {
+ j2 = j<<1;
+ jm3 = (j<3) ? 0 : j-3;
+ jm2 = (j<2) ? 0 : j-2;
+ jm1 = (j<1) ? 0 : j-1;
+ jp1 = (j<h-1) ? j+1 : h-1;
+ jp2 = (j<h-2) ? j+2 : h-1;
+ jp3 = (j<h-3) ? j+3 : h-1;
+
+ /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
+ /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
+ dst[w*j2] = Clip[(int)( 3*src[w*jm3]
+ -16*src[w*jm2]
+ +67*src[w*jm1]
+ +227*src[w*j]
+ -32*src[w*jp1]
+ +7*src[w*jp2]+128)>>8];
+
+ dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
+ -16*src[w*jp2]
+ +67*src[w*jp1]
+ +227*src[w*j]
+ -32*src[w*jm1]
+ +7*src[w*jm2]+128)>>8];
+ }
+ src++;
+ dst++;
+ }
+ }
+ else
+ {
+ /* intra field */
+ for (i=0; i<w; i++)
+ {
+ for (j=0; j<h; j+=2)
+ {
+ j2 = j<<1;
+
+ /* top field */
+ jm6 = (j<6) ? 0 : j-6;
+ jm4 = (j<4) ? 0 : j-4;
+ jm2 = (j<2) ? 0 : j-2;
+ jp2 = (j<h-2) ? j+2 : h-2;
+ jp4 = (j<h-4) ? j+4 : h-2;
+ jp6 = (j<h-6) ? j+6 : h-2;
+
+ /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
+ /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
+ dst[w*j2] = Clip[(int)( 1*src[w*jm6]
+ -7*src[w*jm4]
+ +30*src[w*jm2]
+ +248*src[w*j]
+ -21*src[w*jp2]
+ +5*src[w*jp4]+128)>>8];
+
+ /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
+ /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
+ dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
+ -35*src[w*jm2]
+ +194*src[w*j]
+ +110*src[w*jp2]
+ -24*src[w*jp4]
+ +4*src[w*jp6]+128)>>8];
+
+ /* bottom field */
+ jm5 = (j<5) ? 1 : j-5;
+ jm3 = (j<3) ? 1 : j-3;
+ jm1 = (j<1) ? 1 : j-1;
+ jp1 = (j<h-1) ? j+1 : h-1;
+ jp3 = (j<h-3) ? j+3 : h-1;
+ jp5 = (j<h-5) ? j+5 : h-1;
+ jp7 = (j<h-7) ? j+7 : h-1;
+
+ /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
+ /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
+ dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
+ -35*src[w*jp3]
+ +194*src[w*jp1]
+ +110*src[w*jm1]
+ -24*src[w*jm3]
+ +4*src[w*jm5]+128)>>8];
+
+ dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
+ -7*src[w*jp5]
+ +30*src[w*jp3]
+ +248*src[w*jp1]
+ -21*src[w*jm1]
+ +5*src[w*jm3]+128)>>8];
+ }
+ src++;
+ dst++;
+ }
+ }
+}
+
+
+
+
+
+// Frame buffer for displaying pictures
+
+struct framebuf_struct *get_free_framebuf();
+void insert_frame(struct framebuf_struct *f);
+struct framebuf_struct *remove_frame();
+
+int framebuf_sz;
+
+// a queue of framebufs
+struct framebuf_struct *framebuf_first;
+struct framebuf_struct *framebuf_last;
+
+// free framebuf list
+struct framebuf_struct *framebuf_free;
+
+// some semaphores
+sem_t framebuf_sem;
+sem_t framebuf_count;
+sem_t framebuf_freecount;
+
+void allocate_framebuf()
+{
+ struct framebuf_struct *f;
+
+ f = (struct framebuf_struct *)malloc(sizeof(struct framebuf_struct));
+ if (!f) {
+ cputs("Not enough memory!!!\n");
+ sys_end();
+ }
+
+ f->f = (WORD *)malloc(framebuf_sz);
+ if (!f->f) {
+ cputs("Not enough memory for buffer!!!\n");
+ sys_end();
+ }
+
+ f->next = framebuf_free;
+ framebuf_free = f;
+ cprintf("(Alloc %d %d)\n",f,f->f);
+}
+
+void Initialize_framebuf(int sz)
+{
+ int i;
+
+ framebuf_first = NULL;
+ framebuf_last = NULL;
+ framebuf_free = NULL;
+ framebuf_sz = sz;
+
+ cprintf("Coded W=%d H=%d sz=%d\n",Coded_Picture_Width,Coded_Picture_Height,sz);
+
+ for (i=0; i<MAX_FRAMEBUF; i++)
+ allocate_framebuf();
+
+ sem_init(&framebuf_sem,0,1);
+ sem_init(&framebuf_count,0,0);
+ sem_init(&framebuf_freecount,0,MAX_FRAMEBUF);
+}
+
+struct framebuf_struct *get_free_framebuf()
+{
+ struct framebuf_struct *f;
+
+#ifdef DEBUG_MAILBOX
+ cprintf("G");
+#endif
+ sem_wait(&framebuf_freecount);
+ sem_wait(&framebuf_sem);
+
+ //if (!framebuf_free)
+ // allocate_framebuf();
+
+ f = framebuf_free;
+
+ framebuf_free = framebuf_free->next;
+
+ sem_post(&framebuf_sem);
+
+ return f;
+}
+
+void insert_frame(struct framebuf_struct *f)
+{
+ struct framebuf_struct *p, *q;
+ int n;
+
+#ifdef DEBUG_MAILBOX
+ cprintf("I");
+#endif
+ sem_wait(&framebuf_sem);
+
+ p = NULL;
+ q = framebuf_first;
+ n = f->n;
+
+ while ((q != NULL) && (n >= q->n)) {
+ p = q;
+ q = q->next;
+ }
+
+ if (p)
+ p->next = f;
+ else
+ framebuf_first = f;
+
+ if (q)
+ q->prev = f;
+ else
+ framebuf_last = f;
+
+ f->next = q;
+ f->prev = p;
+
+ sem_post(&framebuf_count);
+ sem_post(&framebuf_sem);
+}
+
+struct framebuf_struct *remove_frame()
+{
+ struct framebuf_struct *f;
+
+#ifdef DEBUG_MAILBOX
+ cprintf("R");
+#endif
+ sem_wait(&framebuf_count);
+ sem_wait(&framebuf_sem);
+
+
+ // remove the first frame
+ f = framebuf_first;
+
+ if (!f)
+ sys_abort(69); // should never happen
+
+ framebuf_first = framebuf_first->next;
+
+ if (framebuf_first)
+ framebuf_first->prev = NULL;
+ else
+ framebuf_last = NULL;
+
+ sem_post(&framebuf_sem);
+
+ return f;
+}
+
+void give_back_framebuf(struct framebuf_struct *f)
+{
+#ifdef DEBUG_MAILBOX
+ cprintf("B");
+#endif
+ sem_wait(&framebuf_sem);
+
+ f->next = framebuf_free;
+ framebuf_free = f;
+
+ sem_post(&framebuf_sem);
+ sem_post(&framebuf_freecount);
+}
+
+
+
+
+
Index: branches/pj/mpeg2/makefile
===================================================================
--- branches/pj/mpeg2/makefile (nonexistent)
+++ branches/pj/mpeg2/makefile (revision 1085)
@@ -0,0 +1,19 @@
+#
+# The mpeg library
+#
+
+# (see sources for copyrights)
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= mpeg2dec
+
+include $(BASE)/config/example.mk
+
+OBJS= "initfile.o jetctrl.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o systems.o subspic.o verify.o gvideo.o"
+
+mpeg2dec:
+ make -f $(SUBMAKE) APP=mpeg2dec INIT= OTHEROBJS=$(OBJS) OTHERINCL=
Index: branches/pj/mpeg2/examples
===================================================================
--- branches/pj/mpeg2/examples (nonexistent)
+++ branches/pj/mpeg2/examples (revision 1085)
@@ -0,0 +1,49 @@
+EXAMPLES:
+
+1. to decode a bitstream with double precision IDCT, such as
+ to create a reference reconstruction set of frames:
+
+ mpeg2decode -r -f -o0 rec%d -b bitstream.mpg
+
+2. to decode a bitstream with fast integer IDCT, such as
+ to create a test reconstruction set of frames:
+
+ mpeg2decode -f -o0 rec%d -b bitstream.mpg
+
+3. To substitute reference pictures with external reference
+ pictures (ref%d):
+
+ mpeg2decode -f -x ref%d -b bitstream.mpg -o0 rec%d
+
+
+4. Same as 3. only using a single large concatenated file for the
+ sequence of reconstruction frames.
+
+ mpeg2decode -f -g -x ref%d bitstream.mpg -o0 rec%d
+
+5. Decode an SNR enhancement bitstream at the same time as base layer
+ stream:
+
+ mpeg2decode -o0 rec%d -e snr_bitstream.mpg -b base_bitstream.mpg
+
+6. Decode a Spatially scalable bitstream
+
+ Step 1: create lower layer reconstruction
+
+ mpeg2decode -f -o0 llrec%d -b base_layer.mpg
+
+ Step 2: decode enhancement bitstream, combined reconstruction.
+
+ mpeg2decode -f -l llrec%d -b enhancement_layer.mpg -o0 rec%d
+
+------------
+ where:
+ -o0 specifies .Y, .U, .V input
+ -f specifies field interleaved format
+ -b is the bitstream flag
+ -g specifies substitute file is a large concatendated one.
+ -e substitution flag
+ ref.pic filename of substitution sequence
+ bitstream.mpg bitstream
+ test%d output file pattern
+
Index: branches/pj/base/cabs.dat
===================================================================
--- branches/pj/base/cabs.dat (nonexistent)
+++ branches/pj/base/cabs.dat (revision 1085)
@@ -0,0 +1,11 @@
+----------------------------------------------------
+system tick (ms): 1
+----------------------------------------------------
+
+task periods (ticks)
+----------------------------------------------------
+producer 1: 200 consumer 1: 400
+producer 2: 100 consumer 2: 400
+producer 3: 300 consumer 3: 150
+producer 4: 800 consumer 4: 200
+----------------------------------------------------
Index: branches/pj/base/initfile.c
===================================================================
--- branches/pj/base/initfile.c (nonexistent)
+++ branches/pj/base/initfile.c (revision 1085)
@@ -0,0 +1,120 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ System initialization file
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBS (Costant Bandwidth Server) level
+ a Dummy level
+
+ It can accept these task models:
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ SOFT_TASK_MODEL (met, period) at level 1
+ NRT_TASK_MODEL at level 2
+
+ This file is similar to the configuration of kernel/init/hartik3.c
+
+ TICK is set to 0 (one-shot timer is used)
+*/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ keyb_def_map(kparms,itaMap);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/base/cabs.c
===================================================================
--- branches/pj/base/cabs.c (nonexistent)
+++ branches/pj/base/cabs.c (revision 1085)
@@ -0,0 +1,323 @@
+/*--------------------------------------------------------------*/
+/* TEST ON CABS */
+/*--------------------------------------------------------------*/
+
+#include <kernel/kern.h>
+#include <modules/cabs.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <string.h>
+
+#define NCAB 4 /* max number of CABs */
+#define NCAR 26 /* generated characters */
+
+#define YP 32 /* level of arrows */
+#define R 20 /* task radius */
+#define YY (YP+R+32) /* level of writing */
+#define DELTA (2*R+72) /* total channel hight */
+#define X1 120 /* start column for P1 */
+#define X2 360 /* start column for P2 */
+
+#define XP1 (X1+64) /* X position of task 1 */
+#define XP2 (X2+64) /* X position of task 2 */
+#define XC (XP1+96) /* X position of CAB */
+#define L 52 /* CAB rectangle length */
+
+void my_exit(KEY_EVT *k);
+void draw_channel(int i);
+void create_channel(int i);
+void get_data();
+
+TASK producer(void *arg);
+TASK consumer(void *arg);
+
+char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"};
+char *pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"};
+char *pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"};
+
+CAB cid[NCAB]; /* CAB identifiers */
+PID p1[NCAB], p2[NCAB]; /* task identifiers */
+
+/* Task Periods */
+TIME t1[NCAB] = {200000, 100000, 300000, 800000};
+TIME t2[NCAB] = {400000, 400000, 150000, 200000};
+
+/* Task WCETS */
+TIME w1[NCAB] = {10000, 10000, 10000, 10000};
+TIME w2[NCAB] = {10000, 10000, 10000, 10000};
+
+
+/****************************************************************/
+
+/* This is the exception handler. It is called when an exception
+ is raised.
+ It exits from the graphical mode, then it prints a message and
+ shutdown the kernel using sys_abort()
+*/
+
+void demo_exc_handler(int signo, siginfo_t *info, void *extra)
+{
+ struct timespec t;
+
+ grx_close();
+
+ /* Default action for an kern exception is */
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t),
+ kern_printf("\nS.Ha.R.K. Exception raised!!!"
+ "\nTime (s:ns) :%ld:%ld"
+ "\nException number:%d (numbers in include/bits/errno.h)"
+ "\nPID :%d\n",
+ t.tv_sec, t.tv_nsec, info->si_value.sival_int,
+ info->si_task);
+ sys_abort(1);
+}
+
+/******************************************************************/
+
+/* This function is called when Alt-X is pressed.
+ It simply shutdown the system using sys_end.
+ Note that the byebye() function is called only if we exit from
+ the system using sys_end()!!!!
+*/
+void my_end(KEY_EVT* e)
+{
+ sys_end();
+}
+
+/******************************************************************/
+
+/* This function is called when the system exit correctly after Alt-X.
+ It exits from the graphic mode and then it prints a small greeting.
+ Note that:
+ - The function calls grx_exit, so it must be registered using
+ RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
+ at that point the kernel is already returned in real mode!!!)
+ - When an exception is raised, the exception handler is called.
+ Since the exception handler already exits from the graphic mode,
+ this funcion has not to be called. For this reason:
+ . we registered byebye using the flag NO_AT_ABORT
+ . the exception handler exits using sys_abort; in that way byebye is
+ NOT called
+*/
+
+
+/*--------------------------------------------------------------*/
+/* User exit function */
+/*--------------------------------------------------------------*/
+
+void byebye(void *arg)
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/*--------------------------------------------------------------*/
+/* Main task */
+/*--------------------------------------------------------------*/
+
+
+/****************************** MAIN ******************************/
+
+int main(int argc, char **argv)
+{
+ struct sigaction action;
+
+ char c = 0; /* character from keyboard */
+
+ /* Init the standard S.Ha.R.K. exception handler */
+ action.sa_flags = SA_SIGINFO; /* Set the signal action */
+ action.sa_sigaction = demo_exc_handler;
+ action.sa_handler = 0;
+ sigfillset(&action.sa_mask); /* we block all the other signals... */
+
+ if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
+ perror("Error initializing signals...");
+ sys_end();
+ }
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(640, 480, 8) < 0) {
+ kern_printf("GRX Err\n");
+ sys_abort(1);
+ }
+ kern_printf("Video card ok!\n");
+
+ grx_clear(BLACK);
+
+ grx_text("Press a key [1-4]", 10, 16, 7, 0);
+ grx_text("to create a pair", 10, 24, 7, 0);
+ grx_text("ESC to exit demo", 10, 48, 7, 0);
+
+ while (c != 27) {
+ c = keyb_getch(BLOCK);
+ if ((c >= '1') && (c <= '1'+NCAB-1))
+ create_channel(c-'1');
+ }
+
+ sys_end();
+
+ return 0;
+}
+
+
+/*--------------------------------------------------------------*/
+/* write data in a cab */
+/*--------------------------------------------------------------*/
+
+TASK producer(void *arg)
+{
+int i = (int)arg;
+char c; /* message character */
+char *p; /* pointer to a cab buffer */
+char s[2]; /* string to display */
+int k = 0;
+int x, y;
+int col = 13;
+int ybase = YY + i*DELTA;
+
+ x = X1;
+ y = ybase;
+ s[1] = 0;
+
+ k = 0;
+ while (1) {
+ c = 'A' + k;
+ p = cab_reserve(cid[i]);
+ *p = c;
+ cab_putmes(cid[i], p);
+
+ s[0] = c;
+ k = (k + 1) % NCAR;
+ grx_text(s,x,y,col,0);
+
+ x += 8;
+ if (x >= (X1 + NCAR*8)) {
+ x = X1;
+ y = y + 8;
+ if (y >= ybase+16) {
+ y = ybase;
+ col = col % 15 + 1;
+ }
+ }
+
+ task_endcycle();
+ }
+}
+
+/*--------------------------------------------------------------*/
+/* read data from a cab */
+/*--------------------------------------------------------------*/
+
+TASK consumer(void *arg)
+{
+int i = (int)arg;
+char *p;
+char s[2];
+int x, y;
+int col = 13;
+int ybase = YY + i*DELTA;
+
+ x = X2;
+ y = ybase;
+ s[1] = 0;
+
+ while (1) {
+ p = cab_getmes(cid[i]);
+ s[0] = *p - 'A' + 'a';
+ cab_unget(cid[i], p);
+
+ grx_text(s,x,y,col,0);
+ x += 8;
+
+ if (x >= (X2 + NCAR*8)) {
+ x = X2;
+ y = y + 8;
+ if (y >= ybase+16) {
+ y = ybase;
+ col = col % 15 + 1;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+/*--------------------------------------------------------------*/
+/* create the two tasks and a channel */
+/*--------------------------------------------------------------*/
+
+void create_channel(int i)
+{
+ HARD_TASK_MODEL m;
+
+ draw_channel(i);
+ cid[i] = cab_create(cname[i], 1, 2);
+
+ hard_task_default_model(m);
+ hard_task_def_ctrl_jet (m);
+ hard_task_def_arg (m, (void *)i);
+ hard_task_def_wcet (m, w1[i]);
+ hard_task_def_mit (m, t1[i]);
+ hard_task_def_usemath (m);
+ p1[i] = task_create(pname1[i], producer, &m, NULL);
+ if (p1[i] == NIL) {
+ grx_close();
+ perror("Could not create task <producer>");
+ sys_abort(1);
+ }
+ task_activate(p1[i]);
+
+ hard_task_default_model(m);
+ hard_task_def_ctrl_jet (m);
+ hard_task_def_arg (m, (void *)i);
+ hard_task_def_wcet (m, w2[i]);
+ hard_task_def_mit (m, t2[i]);
+ hard_task_def_usemath (m);
+ p2[i] = task_create(pname2[i], consumer, &m, NULL);
+ if (p2[i] == NIL) {
+ grx_close();
+ perror("Could not create task <consumer>");
+ sys_abort(1);
+ }
+ task_activate(p2[i]);
+}
+
+/*--------------------------------------------------------------*/
+/* Disegna i processi e il canale di comunicazione */
+/*--------------------------------------------------------------*/
+
+void draw_channel(int i)
+{
+char buffer[32]; /* buffer per sprintf */
+int yc = YP + i*DELTA; /* altezza del canale */
+
+ grx_circle(XP1,yc,R,2);
+ grx_text("P1",XP1-8,yc-4,12,0);
+
+ grx_circle(XP2,yc,R,2);
+ grx_text("P2",XP2-8,yc-4,12,0);
+
+ grx_rect(XC,yc-R,XC+L,yc+R,3);
+ grx_text("CAB",XC+16,yc-4,12,0);
+
+ grx_line(XP1+R,yc,XC,yc,4);
+ grx_line(XC+L,yc,XP2-R,yc,4);
+
+ grx_text("T1 = ms",X1+40,yc+R+16,14,0);
+ sprintf(buffer,"%ld", t1[i]);
+ grx_text(buffer,X1+88,yc+R+16,14,0);
+
+ grx_text("T2 = ms",X2+40,yc+R+16,14,0);
+ sprintf(buffer,"%ld", t2[i]);
+ grx_text(buffer,X2+88,yc+R+16,14,0);
+}
+
+/*--------------------------------------------------------------*/
+
Index: branches/pj/base/fly.c
===================================================================
--- branches/pj/base/fly.c (nonexistent)
+++ branches/pj/base/fly.c (revision 1085)
@@ -0,0 +1,220 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: fly.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*--------------------------------------------------------------*/
+/* SIMULATION OF RANDOM FLIES */
+/*--------------------------------------------------------------*/
+
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define YMENU 10 /* menu level */
+#define XMIN 50
+#define XMAX 600
+#define YMIN 100
+#define YMAX 450
+#define VEL 5 /* linear velocity (def. = 5) */
+#define ANG 30 /* angolo massimo sterzata (30) */
+#define D 3 /* raggio mosca */
+#define ESC 27 /* ASCII code of ESCAPE key */
+#define MAX_P 35 /* max number of flies */
+#define FLYGROUP 1
+
+double tick = 1.0; /* system tick = 1 ms */
+int fly_period = 40000; /* task period */
+int fly_wcet = 1000; /* task wcet */
+PID pid;
+sem_t mutex;
+
+/*--------------------------------------------------------------*/
+
+void draw_fly(int x, int y, int c)
+{
+ sem_wait(&mutex);
+ grx_disc(x, y, D, c);
+ sem_post(&mutex);
+}
+
+/******************************************************************/
+
+TASK fly(void *arg)
+{
+int x, y;
+int ox, oy;
+int dx, dy, da;
+int teta, col;
+int outx, outy;
+double r;
+int i = (int)arg;
+
+ x = ox = (XMIN+XMAX)/2;
+ y = oy = (YMIN+YMAX)/2;
+ teta = 0;
+ col = 2 + i; /* colore fly */
+
+ while (1) {
+
+ da = rand()%(2*ANG) - ANG; /* da = [-ANG,ANG] */
+ teta += da;
+
+ if (teta > 360) teta -= 360;
+ if (teta < 0) teta += 360;
+ r = (double)teta * PI / 180.;
+
+ dx = (float)(VEL * cos(r));
+ dy = (float)(VEL * sin(r));
+ x += dx;
+ y += dy;
+
+ outx = (x >= XMAX) || (x <= XMIN);
+ outy = (y >= YMAX) || (y <= YMIN);
+
+ if (outx || outy) {
+ x = x - dx;
+ y = y - dy;
+ if (outx) teta = 180 - teta;
+ if (outy) teta = -teta;
+ if (teta > 360) teta -= 360;
+ if (teta < 0) teta += 360;
+ r = (double)teta * PI / 180.;
+
+ dx = (float)(VEL * cos(r));
+ dy = (float)(VEL * sin(r));
+
+ x += dx;
+ y += dy;
+ }
+
+ draw_fly(ox, oy, 0);
+ draw_fly(x, y, col);
+ ox = x; oy = y;
+
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+
+/* This function is called when the system exits */
+void byebye(void *arg)
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/****************************** MAIN ******************************/
+
+int main(int argc, char **argv)
+{
+ HARD_TASK_MODEL m;
+
+ char c; /* character from keyboard */
+ int i = 0; /* number of tasks created */
+ TIME seme; /* used to init the random seed */
+
+ /* Set the exception handler */
+ set_exchandler_grx();
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(640, 480, 8) < 0) {
+ kern_printf("GRX Err\n");
+ sys_abort(1);
+ }
+ kern_printf("Video card ok!\n");
+
+ /* The scenario */
+ grx_rect(XMIN-D-1, YMIN-D-1, XMAX+D+1, YMAX+D+1, 14);
+ grx_text("Simulation of Random Flies", XMIN, YMENU+10, 13, 0);
+ grx_text("SPACE create a fly" , XMIN, YMENU+20, 12, 0);
+ grx_text("ESC exit to DOS" , XMIN, YMENU+30, 12, 0);
+
+ /* The program waits a space to create a fly */
+ c = keyb_getch(BLOCK);
+
+ /* randomize!!!! */
+ seme = sys_gettime(NULL);
+ srand(seme);
+
+ do {
+ if ((c == ' ') && (i < MAX_P)) {
+ hard_task_default_model(m);
+ hard_task_def_ctrl_jet (m);
+ hard_task_def_arg (m, (void *)i);
+ hard_task_def_wcet (m, fly_wcet);
+ hard_task_def_mit (m, fly_period);
+ hard_task_def_group (m, FLYGROUP);
+ hard_task_def_usemath (m);
+ pid = task_create("fly", fly, &m, NULL);
+ if (pid == NIL) {
+ grx_close();
+ perror("Could not create task <fly>");
+ sys_abort(1);
+ }
+ task_activate(pid);
+ i++;
+ }
+ c = keyb_getch(BLOCK);
+
+ } while (c != ESC);
+
+ sys_end();
+
+ return 0;
+}
+
+/*--------------------------------------------------------------*/
Index: branches/pj/base/ego.c
===================================================================
--- branches/pj/base/ego.c (nonexistent)
+++ branches/pj/base/ego.c (revision 1085)
@@ -0,0 +1,279 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ego.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/****************************************************************/
+/* PERIODIC PROCESS TEST */
+/****************************************************************/
+
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+
+#include <semaphore.h>
+
+#define X0 10
+
+/* task periods */
+#define PERIOD_T1 100000
+#define PERIOD_T2 200000
+#define PERIOD_T3 300000
+
+/* X position of the text printed by each task */
+int y[3] = {100, 180, 260};
+
+/* text printed by each task */
+char talk[3][50] = { "I am ego1 and I print a character every 100 ms",
+ "I am ego2 and I print a character every 200 ms",
+ "I am ego3 and I print a character every 300 ms"};
+
+/* A semaphore used to access Video Cards in mutual exclusion */
+sem_t mutex;
+
+/***************************************************************/
+
+TASK ego(void *arg)
+{
+int i = (int)arg;
+int leng;
+char s[2];
+int x;
+int j = 0;
+
+ /* compute the length of the string to print */
+ leng = 0;
+ while (talk[i][leng] != 0) leng++;
+
+ x = X0;
+ s[1] = 0;
+ task_endcycle();
+
+ while (1) {
+ s[0] = talk[i][j];
+ sem_wait(&mutex);
+ /* grx_text("TEST", 100,100,12,0); */
+ grx_text(s,x,y[i],12+i,0);
+ sem_post(&mutex);
+ x += 8;
+ if (++j == leng) {
+ j = 0;
+ x = X0;
+ y[i] += 8;
+ if (y[i]>340) y[i]=100;
+ }
+ task_endcycle();
+ }
+}
+
+
+/****************************************************************/
+
+/* This is the exception handler. It is called when an exception
+ is raised.
+ It exits from the graphical mode, then it prints a message and
+ shutdown the kernel using sys_abort()
+*/
+
+void demo_exc_handler(int signo, siginfo_t *info, void *extra)
+{
+ struct timespec t;
+
+ grx_close();
+
+ /* Default action for an kern exception is */
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t),
+ kern_printf("\nS.Ha.R.K. Exception raised!!!"
+ "\nTime (s:ns) :%ld:%ld"
+ "\nException number:%d (numbers in include/bits/errno.h)"
+ "\nPID :%d\n",
+ t.tv_sec, t.tv_nsec, info->si_value.sival_int,
+ info->si_task);
+ sys_abort(1);
+}
+
+/******************************************************************/
+
+/* This function is called when Alt-X is pressed.
+ It simply shutdown the system using sys_end.
+ Note that the byebye() function is called only if we exit from
+ the system using sys_end()!!!!
+*/
+void my_end(KEY_EVT* e)
+{
+ sys_end();
+}
+
+/******************************************************************/
+
+/* This function is called when the system exit correctly after Alt-X.
+ It exits from the graphic mode and then it prints a small greeting.
+ Note that:
+ - The function calls grx_exit, so it must be registered using
+ RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
+ at that point the kernel is already returned in real mode!!!)
+ - When an exception is raised, the exception handler is called.
+ Since the exception handler already exits from the graphic mode,
+ this funcion has not to be called. For this reason:
+ . we registered byebye using the flag NO_AT_ABORT
+ . the exception handler exits using sys_abort; in that way byebye is
+ NOT called
+*/
+
+void byebye(void *arg)
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/****************************** MAIN ******************************/
+
+int main(int argc, char **argv)
+{
+ PID pid1, pid2, pid3;
+ KEY_EVT emerg;
+ HARD_TASK_MODEL m1, m2, m3;
+ struct sigaction action;
+
+ /* Init the standard S.Ha.R.K. exception handler */
+ action.sa_flags = SA_SIGINFO; /* Set the signal action */
+ action.sa_sigaction = demo_exc_handler;
+ action.sa_handler = 0;
+ sigfillset(&action.sa_mask); /* we block all the other signals... */
+
+ if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
+ perror("Error initializing signals...");
+ sys_end();
+ }
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
+
+ /* Initializes the semaphore */
+ sem_init(&mutex,0,1);
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(640, 480, 8) < 0) {
+ kern_printf("GRX Err\n");
+ sys_abort(1);
+ }
+ kern_printf("Video card ok!\n");
+
+ /* set the keyboard handler to exit correctly */
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,my_end);
+
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTR_BIT;
+ keyb_hook(emerg,my_end);
+
+ /* a small banner */
+ grx_text("EGO Test",8,8,WHITE,0);
+ grx_text("Press Alt-X to exit",8,16,WHITE,0);
+
+ /* ego1 creation */
+ hard_task_default_model(m1);
+ hard_task_def_ctrl_jet (m1);
+ hard_task_def_arg (m1, (void *)0);
+ hard_task_def_wcet (m1, 5000);
+ hard_task_def_mit (m1, PERIOD_T1);
+ hard_task_def_group (m1,1);
+ pid1 = task_create("ego1", ego, &m1, NULL);
+ if (pid1 == NIL) {
+ grx_close();
+ perror("Could not create task <ego1>");
+ sys_abort(1);
+ }
+
+ /* ego2 creation */
+ hard_task_default_model(m2);
+ hard_task_def_ctrl_jet (m2);
+ hard_task_def_arg (m2, (void *)1);
+ hard_task_def_wcet (m2, 5000);
+ hard_task_def_mit (m2, PERIOD_T2);
+ hard_task_def_group (m2,1);
+ pid2 = task_create("ego2", ego, &m2, NULL);
+ if (pid2 == NIL) {
+ grx_close();
+ perror("Could not create task <ego2>");
+ sys_abort(1);
+ }
+
+ /* ego3 creation */
+ hard_task_default_model(m3);
+ hard_task_def_ctrl_jet (m3);
+ hard_task_def_arg (m3, (void *)2);
+ hard_task_def_wcet (m3, 5000);
+ hard_task_def_mit (m3, PERIOD_T3);
+ hard_task_def_group (m3,1);
+ pid3 = task_create("ego3", ego, &m3, NULL);
+ if (pid3 == NIL) {
+ grx_close();
+ perror("Could not create task <ego3>");
+ sys_abort(1);
+ }
+
+ /* and finally we activate the three threads... */
+ group_activate(1);
+
+ /*
+ now the task main ends, but the system does not shutdown because
+ there are the three task ego1, ego2, and ego3 running.
+
+ The demo will finish if a Alt-X key is pressed.
+ */
+
+ return 0;
+}
+
+/****************************************************************/
Index: branches/pj/base/makefile
===================================================================
--- branches/pj/base/makefile (nonexistent)
+++ branches/pj/base/makefile (revision 1085)
@@ -0,0 +1,22 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= ego fly cabs
+
+include $(BASE)/config/example.mk
+
+ego:
+ make -f $(SUBMAKE) APP=ego INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
+fly:
+ make -f $(SUBMAKE) APP=fly INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
+cabs:
+ make -f $(SUBMAKE) APP=cabs INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
Index: branches/pj/readme.txt
===================================================================
--- branches/pj/readme.txt (nonexistent)
+++ branches/pj/readme.txt (revision 1085)
@@ -0,0 +1,7 @@
+Hi, these are the S.Ha.R.K. demos...
+
+the old examples directory is now called demos/oldexamples...
+
+Enjoy
+
+PJ
Index: branches/pj/oldexamples/tracer/test0.c
===================================================================
--- branches/pj/oldexamples/tracer/test0.c (nonexistent)
+++ branches/pj/oldexamples/tracer/test0.c (revision 1085)
@@ -0,0 +1,71 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/ALFA1.TXT"
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+int __register_sub_init_prologue(void)
+{
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ int h;
+
+ showmessage("A file is opened for reading while the tracer\n"
+ "with a fixed queue is runnig\n");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+ if (h>=0) {
+ char buffer[128];
+ int len;
+ cprintf("OPENED!\n");
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ close(h);
+
+ } else
+ cprintf("FAILED!\n");
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/hello.c
===================================================================
--- branches/pj/oldexamples/tracer/hello.c (nonexistent)
+++ branches/pj/oldexamples/tracer/hello.c (revision 1085)
@@ -0,0 +1,209 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: hello.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:48 $
+ */
+
+/*
+ * Example of tracer initialization.
+ */
+
+#include <ll/i386/cons.h>
+
+#include <kernel/func.h>
+#include <kernel/trace.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#include <sys/mount.h>
+#include <stddef.h>
+
+/*
+ this example use initfs.c to initialize the system; this file define
+ the following two function.
+
+ __kernel_register_levels__(), must initialize all kernel modules,
+ it has this structure:
+
+ {
+ __register_sub_init_prologue();
+
+ ... modules initialization....
+
+ __register_sub_init();
+ }
+
+ __init__(void *arg) is called when the first task is created
+ and must call the main():
+
+ {
+
+ ... drivers initialization ....
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ call_main()
+
+ }
+
+ */
+
+/*
+ * This function is called before all other modules initialization because
+ * all modules that need the tracer must follow tracer initialization.
+ */
+int __register_sub_init_prologue(void)
+{
+ /* the first functions to call... parameters can be passed */
+ TRC_init_phase1(NULL);
+ /* all the tracer queues must be registrated (in this case only */
+ /* a dummy queue is initialized) */
+ trc_register_dummy_queue();
+ /* the queues must be created (only one in this example) */
+ trc_create_queue(TRC_DUMMY_QUEUE,NULL);
+ /* events can be dispatch to a queue (nothing in this case) */
+ return 0;
+}
+
+/*
+ * This function is called after all other modules initialization
+ * functions... notjing to do.
+ */
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+__dev_t root_device;
+__dev_t temp_device;
+
+/*
+ * Now the system is running... we have to initialize the block device
+ * drivers
+ */
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ /* This to initialize the block device drivers... a NULL can be passed */
+ /* to the bdev_init() functions */
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ /* The following phase ca be made in several way: we must decide the */
+ /* device that we want mount as root... we use the bdev_find_byname() */
+ /* functions to find a specific device */
+ root_device=bdev_find_byname("ide/hda1");
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ /* Well, we want a device to mount into /TEMP */
+ temp_device=bdev_find_byname("ide/hdb3");
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * This is the real filesystem initialization!
+ */
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ extern int libc_initialize(void);
+ int res;
+ struct mount_opts opts;
+
+ /* We set the root device and call the filesystem_init() function */
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ /* We must initialize the libC if we use it */
+ libc_initialize();
+
+ /* We have choose to mount the second partiotion into the /TEMP */
+ /* directory with read/write privilegies (this step is not required) */
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ /* NOW we call the tracer initialization phase 2!!! */
+ /* It must FOLLOW the filesystem initialization... (this function */
+ /* can be called after the call to filesystem_init() functions but */
+ /* we do it here because we want be able to write into the /TEMP */
+ /* directory! */
+ TRC_init_phase2();
+
+ return 0;
+}
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ sys_end();
+}
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nHello, world!\n");
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/sa.c
===================================================================
--- branches/pj/oldexamples/tracer/sa.c (nonexistent)
+++ branches/pj/oldexamples/tracer/sa.c (revision 1085)
@@ -0,0 +1,81 @@
+
+#include <netinet/in.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "types.h"
+#include <trace.h>
+#include "util.h"
+
+/* distribuzione del delta schedule_time - arrival_time */
+
+#define MAXX 50
+#define PREC 100
+#define DELTA ((double)MAXX/(double)PREC)
+
+#include "distr.c"
+
+int task;
+long a=-1;
+long s;
+
+int safunc(trc_event_t *ev)
+{
+ if (event_class(ev->event)!=TRC_CLASS_SYSTEM) return 0;
+
+ if (ev->x.sys.task!=task) return 0;
+
+ if (a==-1) {
+ if (ev->event==TRC_ACTIVATE||ev->event==TRC_INTACTIVATION)
+ a=ev->time;
+ } else {
+ if (ev->event==TRC_SCHEDULE) {
+ s=ev->time;
+ d_insert(s-a);
+ a=-1;
+ }
+ }
+ return 0;
+}
+
+/* -- */
+
+int main(int argc, char *argv[])
+{
+ int res;
+
+ if (argc!=4) {
+ fprintf(stderr,"usage: sa [tracefile] [pid] [outputfile]\n");
+ return -1;
+ }
+
+ d_init();
+
+ task=atoi(argv[2]);
+ res=read_trace(argv[1],safunc);
+
+ if (res==0) {
+ FILE *fout;
+ fout=fopen(argv[3],"wt");
+ if (fout==NULL) {
+ fprintf(stderr,"error writing output file!\n");
+ return 0;
+ }
+ d_dump(fout);
+ fclose(fout);
+ }
+
+ if (res!=0) {
+ fprintf(stderr,"error=%i\n",res);
+ perror("ERROR");
+ }
+
+ return 0;
+}
+
+
+
+
+
+
+
Index: branches/pj/oldexamples/tracer/wait.c
===================================================================
--- branches/pj/oldexamples/tracer/wait.c (nonexistent)
+++ branches/pj/oldexamples/tracer/wait.c (revision 1085)
@@ -0,0 +1,56 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "types.h"
+#include <trace.h>
+#include "util.h"
+
+/* distribuzione dei tempi di attesa sulle richieste al disco */
+
+#define MAXX 37000
+#define PREC 37000
+#define DELTA ((double)MAXX/(double)PREC)
+
+#include "distr.c"
+
+int task;
+long a=-1;
+
+int waitfunc(trc_event_t *ev)
+{
+ if (event_class(ev->event)!=TRC_CLASS_USER) return 0;
+ if (ev->x.usr.n!=task) return 0;
+ if (ev->event==TRC_USER1) {
+ a=ev->time;
+ return 0;
+ }
+ if (ev->event==TRC_USER2) {
+ if (a!=-1) d_insert(ev->time-a);
+ a=-1;
+ }
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ FILE *fout;
+ int res;
+ if (argc!=4) {
+ fprintf(stderr,"missing filename!\n");
+ return -1;
+ }
+ d_init();
+ task=atoi(argv[2]);
+ res=read_trace(argv[1],waitfunc);
+ if (res==0) {
+ fout=fopen(argv[3],"wt");
+ if (fout!=NULL) {
+ d_dump(fout);
+ fclose(fout);
+ } else
+ fprintf(stderr,"can't create output file!\n");
+ } else
+ fprintf(stderr,"read_trace error\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/types.h
===================================================================
--- branches/pj/oldexamples/tracer/types.h (nonexistent)
+++ branches/pj/oldexamples/tracer/types.h (revision 1085)
@@ -0,0 +1,13 @@
+#ifndef __TYPES_H__
+#define __TYPES_H__
+
+#include <sys/types.h>
+
+typedef unsigned char u_int8_t;
+typedef unsigned short u_int16_t;
+typedef unsigned long u_int32_t;
+
+#include <types.h>
+
+#endif
+
Index: branches/pj/oldexamples/tracer/util.c
===================================================================
--- branches/pj/oldexamples/tracer/util.c (nonexistent)
+++ branches/pj/oldexamples/tracer/util.c (revision 1085)
@@ -0,0 +1,122 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "types.h"
+#include <trace.h>
+#include <types.h>
+
+static char *names[]={
+ "reserved",
+ "hoops",
+ /*--*/
+ "create",
+ "activate",
+ "schedule",
+ "delay",
+ "sleep",
+ "endcycle",
+ "destroy",
+ "intactiv",
+ /*--*/
+ "user0",
+ "user1",
+ "user2",
+ "user3",
+ "user4",
+ "user5",
+ "user6",
+ "user7",
+ /*--*/
+ "wait",
+ "waitnb",
+ "signal"
+};
+
+int classtable[TRC_NUMCLASSES+1]={
+ TRC_F_TRACER,
+ TRC_F_SYSTEM,
+ TRC_F_USER,
+ TRC_F_SEM,
+ TRC_F_LAST
+};
+
+int event_class(int ev)
+{
+ int i;
+ if (ev<0||ev>=TRC_NUMEVENTS) return -1;
+ for (i=0;i<TRC_NUMCLASSES;i++)
+ if (ev>=classtable[i]&&ev<classtable[i+1]) return i;
+ return -1;
+}
+
+char *event_name(int ev)
+{
+ if (ev<0||ev>=TRC_NUMEVENTS) return "unknown";
+ return names[ev];
+}
+
+char *event_hexdump(u_int8_t *ptr,int maxsize)
+{
+ static char buffer[256];
+ int i;
+ for (i=0;i<maxsize;i++) sprintf(buffer+i*2,"%02x",*(ptr+i));
+ buffer[maxsize*2]='\0';
+ return buffer;
+}
+
+char *event_strdump(u_int8_t *ptr, int maxsize)
+{
+ static char buffer[256];
+ memcpy(buffer,ptr,maxsize);
+ buffer[maxsize]='\0';
+ return buffer;
+}
+
+
+char *format_time(long time)
+{
+ static char buffer[256];
+
+ if (time<1000l) {
+ sprintf(buffer,"%li",time);
+ return buffer;
+ }
+ if (time<1000000l) {
+ sprintf(buffer,"%li,%03li",time/1000l,time%1000l);
+ return buffer;
+ }
+ sprintf(buffer,"%li,%03li,%03li",
+ (time/1000000l),
+ (time%1000000l)/1000l,
+ time%1000l);
+ return buffer;
+}
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+int read_trace(char *filename,int (*func)(trc_event_t *))
+{
+ trc_event_t buffer;
+ int fin;
+ int res;
+
+ fin=open(filename,O_RDONLY|O_BINARY);
+ if (fin==-1) return -1;
+ for (;;) {
+ res=read(fin,&buffer,sizeof(trc_event_t));
+ if (res!=sizeof(trc_event_t)) {
+ close(fin);
+ return res==0?0:-2;
+ }
+ res=(*func)(&buffer);
+ if (res!=0) {
+ close(fin);
+ return res;
+ }
+ }
+ close(fin);
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/jdump.c
===================================================================
--- branches/pj/oldexamples/tracer/jdump.c (nonexistent)
+++ branches/pj/oldexamples/tracer/jdump.c (revision 1085)
@@ -0,0 +1,465 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: jdump.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:48 $
+ */
+
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "types.h"
+#include <trace.h>
+#include "util.h"
+
+/*
+ *
+ *
+ *
+ */
+
+/* All times are dived by this costant. */
+#define TIMESCALE 1
+
+/* If defined dump on stdout the packets (in ascii) that will be written
+ * on the output file (the file of the tracer).
+ */
+
+#define DUMPOUT
+
+/*
+ *
+ *
+ *
+ */
+
+int pippo=0;
+
+int writeInt(int h, int x)
+{
+ int y,res;
+ y=htonl(x);
+ res=write(h,&y,sizeof(int));
+ return res!=sizeof(int);
+}
+
+
+int writeStr(int h, char *s)
+{
+ int res,size;
+ size=strlen(s);
+ writeInt(h,size);
+ res=write(h,s,size);
+ return res!=size;
+}
+
+/*
+ *
+ */
+
+#define TASK_ARRIVAL 0
+#define TASK_SCHEDULE 1
+#define TASK_DESCHEDULE 2
+#define TASK_END 3
+#define TASK_DLINEPOST 4
+#define TASK_DLINESET 5
+#define TASK_WAIT 6
+#define TASK_SIGNAL 7
+#define TASK_IDLE 8
+#define TASK_NAME 9
+
+#define EVT_NUMBER 10
+
+char *eventsname[]={
+ "task_arrival",
+ "task_schedule",
+ "task_deschedule",
+ "task_end",
+ "task_dlinepost",
+ "task_dlineset",
+ "task_wait",
+ "task_signal",
+ "task_idle",
+ "task_name"
+};
+
+struct j_evt_prolog {
+ int type;
+ int time;
+};
+
+struct j_evt_task {
+ struct j_evt_prolog p;
+ int task;
+};
+
+struct j_evt_dlinepost {
+ struct j_evt_task t;
+ int taskD;
+ int taskD2;
+};
+
+struct j_evt_dlineset {
+ struct j_evt_task t;
+ int taskD;
+};
+
+struct j_evt_semaph {
+ struct j_evt_task t;
+ int res;
+ char *name;
+};
+
+struct j_evt_name {
+ struct j_evt_task t;
+ char *name;
+};
+
+/*
+ *
+ */
+
+int j_write_prolog(int h, void *ptr)
+{
+#ifdef DUMPOUT
+ printf("%10i ",((struct j_evt_prolog *)ptr)->time);
+ printf("%-18s ",eventsname[((struct j_evt_prolog *)ptr)->type]);
+#endif
+ if (writeInt(h,((struct j_evt_prolog *)ptr)->type)) return -2;
+ if (writeInt(h,((struct j_evt_prolog *)ptr)->time)) return -3;
+ return 0;
+}
+
+int j_write_task(int h, void *ptr)
+{
+ int res;
+ res=j_write_prolog(h,ptr);
+#ifdef DUMPOUT
+ printf("tsk=%i ",((struct j_evt_task *)ptr)->task);
+#endif
+ if (res) return res;
+ if (writeInt(h,((struct j_evt_task *)ptr)->task)) return -4;
+ return 0;
+}
+
+int j_write_dlinepost(int h, void *ptr)
+{
+ int res;
+ res=j_write_task(h,ptr);
+ if (res) return res;
+ if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD)) return -5;
+ if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD2)) return -6;
+ return 0;
+}
+
+int j_write_dlineset(int h, void *ptr)
+{
+ int res;
+ res=j_write_task(h,ptr);
+ if (res) return res;
+ if (writeInt(h,((struct j_evt_dlineset *)ptr)->taskD)) return -7;
+ return 0;
+}
+
+int j_write_semaph(int h, void *ptr)
+{
+ int res;
+ res=j_write_task(h,ptr);
+ if (res) return res;
+ if (writeInt(h,((struct j_evt_semaph *)ptr)->res)) return -8;
+ if (writeStr(h,((struct j_evt_semaph *)ptr)->name)) return -9;
+ return 0;
+}
+
+int j_write_name(int h, void *ptr)
+{
+ int res;
+ res=j_write_task(h,ptr);
+#ifdef DUMPOUT
+ printf("name='%s' ",((struct j_evt_name *)ptr)->name);
+#endif
+ if (res) return res;
+ if (writeStr(h,((struct j_evt_name *)ptr)->name)) return -10;
+ return 0;
+}
+
+int writeEvent(int h, void *ptr)
+{
+ int res;
+
+ //printf("<%i>",((struct j_evt_prolog*)ptr)->type);
+
+ ((struct j_evt_prolog*)ptr)->time/=TIMESCALE;
+
+ switch(((struct j_evt_prolog*)ptr)->type) {
+ case TASK_ARRIVAL:
+ case TASK_SCHEDULE:
+ case TASK_DESCHEDULE:
+ case TASK_END:
+ case TASK_IDLE:
+ res=j_write_task(h,ptr);
+ break;
+ case TASK_DLINEPOST:
+ res=j_write_dlinepost(h,ptr);
+ break;
+ case TASK_DLINESET:
+ res=j_write_dlineset(h,ptr);
+ break;
+ case TASK_WAIT:
+ case TASK_SIGNAL:
+ res=j_write_semaph(h,ptr);
+ break;
+ case TASK_NAME:
+ res=j_write_name(h,ptr);
+ break;
+ default:
+ return -1;
+
+ }
+
+#ifdef DUMPOUT
+ printf(" \n");
+#endif
+
+ return res;
+}
+
+/*
+ *
+ *
+ *
+ */
+
+#define MAX_PROC 150
+
+//int activated[MAX_PROC];
+
+int cxx=0;
+/* write MAXC-1 events */
+#define MAXC 14
+
+long lasttime;
+
+int sys_event(int h, void *param)
+{
+ static int prevtask=-1;
+ trc_event_t *ptr=(trc_event_t *)param;
+ struct j_evt_task evt;
+
+ evt.p.time=ptr->time;
+ evt.task=ptr->x.sys.task;
+
+ lasttime=ptr->time;
+ switch(ptr->event) {
+
+ case TRC_CREATE:
+ return 0;
+
+ case TRC_ACTIVATE:
+ case TRC_INTACTIVATION:
+
+
+ //activated[ptr->x.sys.task]=1;
+
+
+ evt.p.type=TASK_ARRIVAL;
+ break;
+
+ case TRC_DESTROY:
+
+
+ //activated[ptr->x.sys.task]=0;
+
+
+
+ return 0;
+
+ case TRC_DELAY:
+ prevtask=-1;
+ evt.p.type=TASK_DESCHEDULE;
+ break;
+
+ case TRC_SLEEP:
+ prevtask=-1;
+ evt.p.type=TASK_DESCHEDULE;
+ break;
+
+ case TRC_ENDCYCLE:
+ evt.p.type=TASK_END;
+ break;
+
+ case TRC_SCHEDULE:
+ if (prevtask!=-1) {
+ struct j_evt_task evt2;
+ int res;
+ evt2.p.time=ptr->time;
+ evt2.p.type=TASK_DESCHEDULE;
+ evt2.task=prevtask;
+ res=writeEvent(h,&evt2);
+ if (res!=0) return -1;
+ }
+
+ /*
+ if (!activated[ptr->x.sys.task]) {
+ struct j_evt_task evt2;
+
+ evt2.p.time=ptr->time-1;
+ evt2.task=ptr->x.sys.task;
+ evt2.p.type=TASK_ARRIVAL;
+
+ writeEvent(h,&evt2);
+
+ activated[ptr->x.sys.task]=1;
+ }
+ */
+
+ evt.p.type=TASK_SCHEDULE;
+ prevtask=ptr->x.sys.task;
+ break;
+
+ default:
+ return 0;
+ }
+
+ cxx++;
+ if (cxx==MAXC) return -1;
+
+ return writeEvent(h,&evt);
+}
+
+
+int sem_event(int h,void *param)
+{
+ //trc_event_t *ptr=(trc_event_t *)param;
+ //struct j_evt_semaph evt;
+
+ return 0;
+ /*
+ evt.t.p.time=ptr->x.norm.when;
+ evt.t.task=ptr->x.norm.who;
+ switch(ptr->what) {
+ case TRC_SEM_WAIT: evt.t.p.type=TASK_WAIT; break;
+ case TRC_SEM_SIGNAL: evt.t.p.type=TASK_SIGNAL; break;
+ case TRC_SEM_WAITNB: return 0;
+ default: return 0;
+ }
+ evt.res=1;
+ evt.name="NoName";
+ return j_write_semaph(h,&evt);
+ */
+}
+
+/* -- */
+
+#define MAX_PROC 150
+int names[MAX_PROC];
+
+int outfile;
+
+int dumpfunc(trc_event_t *ptr)
+{
+ //printf("{%i}",ptr->event);
+
+ if (!names[ptr->x.sys.task]) {
+ struct j_evt_name evtname;
+ static char name[24];
+
+ cxx++;
+ if (cxx==MAXC) return -1;
+
+ evtname.t.p.time=lasttime;
+ evtname.t.task=ptr->x.sys.task;
+ evtname.t.p.type=TASK_NAME;
+ sprintf(name,"task%03i",ptr->x.sys.task);
+ evtname.name=name;
+ writeEvent(outfile,&evtname);
+ names[ptr->x.sys.task]=1;
+
+ }
+
+ switch(event_class(ptr->event)) {
+ case TRC_CLASS_SYSTEM:
+ return sys_event(outfile,ptr);
+ case TRC_CLASS_SEM:
+ return 0;
+ return sem_event(outfile,ptr);
+ case TRC_CLASS_USER:
+ return 0;
+ }
+ return 0;
+}
+
+/*
+ *
+ */
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+int main(int argc, char *argv[])
+{
+ int res;
+ int i;
+
+ if (argc!=3) {
+ fprintf(stderr,"missing filenames\n");
+ fprintf(stderr,"usage: jdump H4tracefilename JTRACERtracefilename\n");
+ return -1;
+ }
+
+ for (i=0;i<MAX_PROC;i++) {
+ names[i]=0;
+ //activated[i]=0;
+ }
+
+ outfile=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0777);
+ if (outfile==-1) {
+ perror("can't open outfile");
+ return -1;
+ }
+ res=read_trace(argv[1],dumpfunc);
+ close(outfile);
+
+ //fprintf(stderr,"result=%i",res);
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/util.h
===================================================================
--- branches/pj/oldexamples/tracer/util.h (nonexistent)
+++ branches/pj/oldexamples/tracer/util.h (revision 1085)
@@ -0,0 +1,17 @@
+
+#ifndef __UTIL_H
+#define __UTIL_H
+
+#include "types.h"
+
+char *event_name(int evt);
+char *event_hexdump(u_int8_t *ptr, int maxsize);
+char *event_strdump(u_int8_t *ptr, int maxsize);
+int event_class(int evt);
+
+int read_trace(char *filename,int (*func)(trc_event_t *));
+
+char *format_time(long time);
+
+#endif
+
Index: branches/pj/oldexamples/tracer/treec1.c
===================================================================
--- branches/pj/oldexamples/tracer/treec1.c (nonexistent)
+++ branches/pj/oldexamples/tracer/treec1.c (revision 1085)
@@ -0,0 +1,211 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+
+int noscroll=0;
+SEM console;
+
+#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
+
+TASK viewdir(void *prof);
+sem_t actmutex,actsync;
+char *globpathname;
+PID globpid;
+int counter=0,actcounter=0;
+
+void activate_task(int prof, char *pathname)
+{
+ char tname[32];
+ NRT_TASK_MODEL m;
+ PID pid;
+
+REPEAT:
+ sem_wait(&actmutex);
+
+ if (actcounter>=MPROC) {
+ sem_signal(&actmutex);
+ task_delay(10000);
+ goto REPEAT;
+ }
+
+ globpathname=pathname;
+ counter++;
+ sprintf(tname,"tsk%i",counter);
+
+ nrt_task_default_model(m);
+ nrt_task_def_arg(m,(void*)counter);
+
+ globpid=pid=task_create(tname,viewdir,&m,NULL);
+ if (pid==-1) {
+ sem_wait(&console);
+ cprintf("can't create '%s'\n",tname);
+ perror("can't create task");
+ sem_signal(&console);
+ sys_end();
+ return;
+ }
+ task_activate(pid);
+ sem_wait(&actsync);
+ actcounter++;
+
+ sem_signal(&actmutex);
+}
+
+/*
+ *
+ */
+
+int filecounter=0;
+
+TASK viewdir(void *pointer)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ char pathname[1024];
+ PID mypid;
+ int prof=(int)pointer;
+
+ strcpy(pathname,globpathname);
+ mypid=globpid;
+ sem_signal(&actsync);
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ sem_wait(&console);
+ cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ goto END;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ sem_wait(&console);
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ cprintf("t%03i %s\n",prof,pathname);
+ filecounter++;
+ sem_signal(&console);
+
+ if (!strcmp(den->d_name,".")) goto SKIP;
+ if (!strcmp(den->d_name,"..")) goto SKIP;
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ sem_wait(&console);
+ cprintf("t%03i can't stat %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ closedir(d);
+ goto END;
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ sem_wait(&console);
+ sem_signal(&console);
+ activate_task(prof,pathname);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+
+END:
+ sem_wait(&actmutex);
+ actcounter--;
+ sem_signal(&actmutex);
+
+ return 0;
+}
+
+/*
+ *
+ */
+
+int __register_sub_init_prologue(void)
+{
+ TRC_init_phase1(NULL);
+ trc_register_circular_queue();
+ trc_create_queue(TRC_CIRCULAR_QUEUE,NULL);
+ return 0;
+}
+
+/*
+ *
+ */
+
+int main(int argc,char *argv[])
+{
+ // int res;
+
+ showmessage("This test show all filenames of a directory of an hardisk\n"
+ "recursively using a soft task for every directory.\n"
+ "The tracer with a circular queue is activated.\n");
+
+ sem_init(&console,0,1);
+ sem_init(&actmutex,0,1);
+ sem_init(&actsync,0,0);
+
+ activate_task(-1,FROMDIR);
+
+ for(;;) {
+ sem_wait(&actmutex);
+ if (actcounter==0) break;
+ sem_signal(&actmutex);
+ task_delay(500000);
+ }
+
+ cprintf("\nfiles: %i\n",filecounter);
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/treec2.c
===================================================================
--- branches/pj/oldexamples/tracer/treec2.c (nonexistent)
+++ branches/pj/oldexamples/tracer/treec2.c (revision 1085)
@@ -0,0 +1,224 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#define sem_signal sem_post
+
+int noscroll=0;
+SEM console;
+
+#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
+
+TASK viewdir(void *prof);
+sem_t actmutex,actsync;
+char *globpathname;
+PID globpid;
+int counter=0,actcounter=0;
+
+void activate_task(int prof, char *pathname)
+{
+ char tname[32];
+ NRT_TASK_MODEL m;
+ PID pid;
+
+REPEAT:
+ sem_wait(&actmutex);
+
+ if (actcounter>=MPROC) {
+ sem_signal(&actmutex);
+ task_delay(10000);
+ goto REPEAT;
+ }
+
+ globpathname=pathname;
+ counter++;
+ sprintf(tname,"tsk%i",counter);
+
+ nrt_task_default_model(m);
+ nrt_task_def_arg(m,(void*)counter);
+
+ globpid=pid=task_create(tname,viewdir,&m,NULL);
+ if (pid==-1) {
+ sem_wait(&console);
+ cprintf("can't create '%s'\n",tname);
+ perror("can't create task");
+ sem_signal(&console);
+ sys_end();
+ return;
+ }
+ task_activate(pid);
+ sem_wait(&actsync);
+ actcounter++;
+
+ sem_signal(&actmutex);
+}
+
+/*
+ *
+ */
+
+int filecounter=0;
+
+TASK viewdir(void *pointer)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ char pathname[1024];
+ PID mypid;
+ int prof=(int)pointer;
+
+ strcpy(pathname,globpathname);
+ mypid=globpid;
+ sem_signal(&actsync);
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ sem_wait(&console);
+ cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ goto END;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ sem_wait(&console);
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ cprintf("t%03i %s\n",prof,pathname);
+ filecounter++;
+ sem_signal(&console);
+
+ if (!strcmp(den->d_name,".")) goto SKIP;
+ if (!strcmp(den->d_name,"..")) goto SKIP;
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ sem_wait(&console);
+ cprintf("t%03i can't stat %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ closedir(d);
+ goto END;
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ sem_wait(&console);
+ sem_signal(&console);
+ activate_task(prof,pathname);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+
+END:
+ sem_wait(&actmutex);
+ actcounter--;
+ sem_signal(&actmutex);
+
+ return 0;
+}
+
+/*
+ *
+ */
+
+int __register_sub_init_prologue(void)
+{
+ TRC_CIRCULAR_PARMS args;
+ int q;
+
+ TRC_init_phase1(NULL);
+ trc_register_circular_queue();
+
+ trc_circular_default_parms(args);
+ trc_circular_def_onlinetask(args);
+ q=trc_create_queue(TRC_CIRCULAR_QUEUE,&args);
+
+ trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
+ trc_trace_class(TRC_CLASS_SYSTEM);
+
+ return 0;
+}
+
+/*
+ *
+ */
+
+int main(int argc,char *argv[])
+{
+ // int res;
+
+ showmessage("This test show all filenames of a directory of an hardisk\n"
+ "recursively using a soft task for every directory.\n"
+ "The tracer with a circular queue is activated that write\n"
+ "on hardisk online (while the system is running)\n");
+
+ sem_init(&console,0,1);
+ sem_init(&actmutex,0,1);
+ sem_init(&actsync,0,0);
+
+ activate_task(-1,FROMDIR);
+ //activate_task(-1,"/");
+
+ for(;;) {
+ sem_wait(&actmutex);
+ if (actcounter==0) break;
+ sem_signal(&actmutex);
+ task_delay(500000);
+ }
+
+ cprintf("\nfiles: %i\n",filecounter);
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/hello1.c
===================================================================
--- branches/pj/oldexamples/tracer/hello1.c (nonexistent)
+++ branches/pj/oldexamples/tracer/hello1.c (revision 1085)
@@ -0,0 +1,27 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <stddef.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+int __register_sub_init_prologue(void)
+{
+ TRC_init_phase1(NULL);
+ trc_register_dummy_queue();
+ trc_create_queue(TRC_DUMMY_QUEUE,NULL);
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nHello, world!\n");
+ cprintf("The tracer has been activated!\n");
+ cprintf("(No result are produced)\n\n");
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/distr.c
===================================================================
--- branches/pj/oldexamples/tracer/distr.c (nonexistent)
+++ branches/pj/oldexamples/tracer/distr.c (revision 1085)
@@ -0,0 +1,44 @@
+
+long t[PREC];
+long counter;
+long hoops;
+long maxv=0;
+
+void d_init(void)
+{
+ int i;
+ hoops=counter=0;
+ for (i=0;i<PREC;i++) t[i]=0;
+}
+
+void d_insert(long d)
+{
+ if (d>=MAXX) {
+ hoops++;
+ if (d>maxv) maxv=d;
+ return;
+ }
+
+ counter++;
+ t[(int)(d/DELTA)]++;
+}
+
+void d_dump(FILE *fout)
+{
+ int i;
+
+ if (counter==0) {
+ fprintf(stderr,"nothing to write to the output file\n");
+ return;
+ }
+
+ if (hoops) {
+ fprintf(stderr,"%li values to big (max=%li)\n",hoops,maxv);
+ }
+
+ for (i=0;i<PREC;i++)
+ fprintf(fout,"%f %f\n",
+ DELTA/2.0+DELTA*i,
+ (double)t[i]/(double)counter
+ );
+}
Index: branches/pj/oldexamples/tracer/road.c
===================================================================
--- branches/pj/oldexamples/tracer/road.c (nonexistent)
+++ branches/pj/oldexamples/tracer/road.c (revision 1085)
@@ -0,0 +1,57 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "types.h"
+#include <trace.h>
+#include "util.h"
+
+
+/* distribuzione degli spostamenti della testina */
+
+#define MAXX 1000
+#define PREC 1000
+#define DELTA ((double)MAXX/(double)PREC)
+
+#include "distr.c"
+
+int dumpusr(int event, trc_user_event_t *usr)
+{
+ static long last=-1;
+ long d;
+ if (event!=TRC_USER0) return 0;
+ if (last!=-1) {
+ d=abs(last-usr->n);
+ d_insert(d);
+ }
+ last=usr->n;
+ return 0;
+}
+
+int dumpfunc(trc_event_t *ev)
+{
+ if (event_class(ev->event)==TRC_CLASS_USER) dumpusr(ev->event,&ev->x.usr);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ FILE *fout;
+ int res;
+ if (argc!=3) {
+ fprintf(stderr,"missing filename!\n");
+ return -1;
+ }
+ d_init();
+ res=read_trace(argv[1],dumpfunc);
+ if (res==0) {
+ fout=fopen(argv[2],"wt");
+ if (fout!=NULL) {
+ d_dump(fout);
+ fclose(fout);
+ } else
+ fprintf(stderr,"can't create output file!\n");
+ } else
+ fprintf(stderr,"read_trace error\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/hello2.c
===================================================================
--- branches/pj/oldexamples/tracer/hello2.c (nonexistent)
+++ branches/pj/oldexamples/tracer/hello2.c (revision 1085)
@@ -0,0 +1,30 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <stddef.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+int __register_sub_init_prologue(void)
+{
+ int q;
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
+ trc_trace_class(TRC_CLASS_SYSTEM);
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nHello, world!\n");
+ cprintf("The tracer has been activated! Look at the results.\n");
+ cprintf("(A fixed queue has been created)\n\n");
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/treef1.c
===================================================================
--- branches/pj/oldexamples/tracer/treef1.c (nonexistent)
+++ branches/pj/oldexamples/tracer/treef1.c (revision 1085)
@@ -0,0 +1,215 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#define sem_signal sem_post
+
+int noscroll=0;
+SEM console;
+
+#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
+
+TASK viewdir(void *prof);
+sem_t actmutex,actsync;
+char *globpathname;
+PID globpid;
+int counter=0,actcounter=0;
+
+void activate_task(int prof, char *pathname)
+{
+ char tname[32];
+ NRT_TASK_MODEL m;
+ PID pid;
+
+REPEAT:
+ sem_wait(&actmutex);
+
+ if (actcounter>=MPROC) {
+ sem_signal(&actmutex);
+ task_delay(10000);
+ goto REPEAT;
+ }
+
+ globpathname=pathname;
+ counter++;
+ sprintf(tname,"tsk%i",counter);
+
+ nrt_task_default_model(m);
+ nrt_task_def_arg(m,(void*)counter);
+
+ globpid=pid=task_create(tname,viewdir,&m,NULL);
+ if (pid==-1) {
+ sem_wait(&console);
+ cprintf("can't create '%s'\n",tname);
+ perror("can't create task");
+ sem_signal(&console);
+ sys_end();
+ return;
+ }
+ task_activate(pid);
+ sem_wait(&actsync);
+ actcounter++;
+
+ sem_signal(&actmutex);
+}
+
+/*
+ *
+ */
+
+int filecounter=0;
+
+TASK viewdir(void *pointer)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ char pathname[1024];
+ PID mypid;
+ int prof=(int)pointer;
+
+ strcpy(pathname,globpathname);
+ mypid=globpid;
+ sem_signal(&actsync);
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ sem_wait(&console);
+ cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ goto END;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ sem_wait(&console);
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ cprintf("t%03i %s\n",prof,pathname);
+ filecounter++;
+ sem_signal(&console);
+
+ if (!strcmp(den->d_name,".")) goto SKIP;
+ if (!strcmp(den->d_name,"..")) goto SKIP;
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ sem_wait(&console);
+ cprintf("t%03i can't stat %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ closedir(d);
+ goto END;
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ sem_wait(&console);
+ sem_signal(&console);
+ activate_task(prof,pathname);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+
+END:
+ sem_wait(&actmutex);
+ actcounter--;
+ sem_signal(&actmutex);
+
+ return 0;
+}
+
+/*
+ *
+ */
+
+int __register_sub_init_prologue(void)
+{
+ int q;
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
+ trc_trace_class(TRC_CLASS_SYSTEM);
+ return 0;
+}
+
+/*
+ *
+ */
+
+int main(int argc,char *argv[])
+{
+ // int res;
+
+ showmessage("This test show all filenames of a directory of an hardisk\n"
+ "recursively using a soft task for every directory.\n"
+ "The tracer with a circular queue is activated.\n");
+
+ sem_init(&console,0,1);
+ sem_init(&actmutex,0,1);
+ sem_init(&actsync,0,0);
+
+ activate_task(-1,FROMDIR);
+
+ for(;;) {
+ sem_wait(&actmutex);
+ if (actcounter==0) break;
+ sem_signal(&actmutex);
+ task_delay(500000);
+ }
+
+ cprintf("\nfiles: %i\n",filecounter);
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/common.c
===================================================================
--- branches/pj/oldexamples/tracer/common.c (nonexistent)
+++ branches/pj/oldexamples/tracer/common.c (revision 1085)
@@ -0,0 +1,134 @@
+
+#include <kernel/func.h>
+#include <kernel/trace.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+__dev_t root_device;
+__dev_t temp_device;
+
+int choose_root_callback(__dev_t dev,__uint8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+/* -- */
+
+extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+/* -- */
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+
+
+ //filesystem_init_prologue();
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ TRC_init_phase2();
+
+ return 0;
+}
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ //dump_sem_table();
+ //dump_nop_table();
+ //sys_status(SCHED_STATUS);
+ sys_end();
+}
+
+/* -- */
+
+void showmessage(char *s)
+{
+ cputs(s);
+ cprintf("Press [x] to begin...");
+ while (keyb_getchar()!='x');
+ cprintf("\n");
+}
+
+void waitend(void)
+{
+ int c;
+ cprintf("Press [x] to exit...");
+ while ((c=keyb_getchar())!='x');
+ cprintf("\n");
+}
Index: branches/pj/oldexamples/tracer/tdump.c
===================================================================
--- branches/pj/oldexamples/tracer/tdump.c (nonexistent)
+++ branches/pj/oldexamples/tracer/tdump.c (revision 1085)
@@ -0,0 +1,73 @@
+
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include "types.h"
+#include <trace.h>
+#include "util.h"
+
+int dumpsys(trc_system_event_t *sys)
+{
+ /*
+ if (sys->event==TRC_SCHEDULE) {
+ //if (sys->prev!=65535)
+ // printf("%02i->%02i\n",sys->prev,sys->task);
+ //else
+ printf("??->%02i\n",sys->task);
+ return 0;
+ }
+ */
+ printf("%02i\n",sys->task);
+ return 0;
+}
+
+int dumpusr(trc_user_event_t *usr)
+{
+ printf("%8li ",usr->n);
+ printf("\n");
+ return 0;
+}
+
+int dumpsem(trc_sem_event_t *sem)
+{
+ printf("on [%i]\n",sem->id);
+ return 0;
+}
+
+int dumpfunc(trc_event_t *ev)
+{
+ static int counter=0;
+
+ printf("%4i ",counter);
+ counter++;
+ printf("%12s ",format_time(ev->time));
+ printf("%-10s ",event_name(ev->event));
+
+ //printf("%08x\n",(unsigned)ev->sys.event);
+ //return 0;
+
+ switch(event_class(ev->event)) {
+ case TRC_CLASS_SYSTEM: return dumpsys(&ev->x.sys);
+ case TRC_CLASS_USER: return dumpusr(&ev->x.usr);
+ case TRC_CLASS_SEM: return dumpsem(&ev->x.sem);
+ }
+ printf("\nEVENT %i... CLASS %i UNKNOWN!\n",ev->event,event_class(ev->event));
+ return -1;
+}
+
+int main(int argc, char *argv[])
+{
+ int res;
+
+ if (argc!=2) {
+ fprintf(stderr,"missing filename!\n");
+ return -1;
+ }
+
+ res=read_trace(argv[1],dumpfunc);
+
+ //fprintf(stderr,"result=%i\n",res);
+ //fprintf(stderr,"size=%li\n",sizeof(trc_event_t));
+
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/simple.c
===================================================================
--- branches/pj/oldexamples/tracer/simple.c (nonexistent)
+++ branches/pj/oldexamples/tracer/simple.c (revision 1085)
@@ -0,0 +1,132 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: simple.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:48 $
+ */
+
+/*
+ * Example of simple tracer initialization.
+ */
+
+#include <ll/i386/cons.h>
+
+#include <kernel/func.h>
+#include <kernel/trace.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <trace/trace.h>
+
+#include <sys/mount.h>
+#include <stddef.h>
+
+#define ROOTDEVICE "ide/hda2"
+
+int __register_sub_init_prologue(void)
+{
+ int res;
+
+ /* tracer initialization phase 1 */
+ res=TRC_init_phase1_standard();
+ if (res!=0) {
+ cprintf("tracer initialization error (%i)!!!\n",res);
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+__dev_t root_device;
+
+int __bdev_sub_init(void)
+{
+ /* block device initialization */
+ bdev_init(NULL);
+
+ /* choose root device */
+ root_device=bdev_find_byname(ROOTDEVICE);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ extern int libc_initialize(void);
+
+ /* filesystems initialization */
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ /* libC initialization */
+ libc_initialize();
+
+ /* tracer initialization phase 2 */
+ TRC_init_phase2_standard();
+ return 0;
+}
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ sys_end();
+}
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nSimple hello world (with tracer)!\n\n");
+ return 0;
+}
Index: branches/pj/oldexamples/tracer/makefile
===================================================================
--- branches/pj/oldexamples/tracer/makefile (nonexistent)
+++ branches/pj/oldexamples/tracer/makefile (revision 1085)
@@ -0,0 +1,69 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= simple hello hello1 hello2 test0 treef1 treec1 treec2
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+simple:
+ make -f $(SUBMAKE) APP=simple INIT=initfs.o OTHEROBJS=
+hello:
+ make -f $(SUBMAKE) APP=hello INIT=initfs.o OTHEROBJS=
+hello1:
+ make -f $(SUBMAKE) APP=hello1 INIT=initfs.o OTHEROBJS=common.o
+hello2:
+ make -f $(SUBMAKE) APP=hello2 INIT=initfs.o OTHEROBJS=common.o
+test0:
+ make -f $(SUBMAKE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
+treef1:
+ make -f $(SUBMAKE) APP=treef1 INIT=initfs.o OTHEROBJS=common.o
+treec1:
+ make -f $(SUBMAKE) APP=treec1 INIT=initfs.o OTHEROBJS=common.o
+treec2:
+ make -f $(SUBMAKE) APP=treec2 INIT=initfs.o OTHEROBJS=common.o
+
+#
+#
+#
+
+
+.PHONY: util
+
+util: tdump.exe jdump.exe sa.exe road.exe wait.exe
+
+tdump.exe: tdump.c util.c
+ gcc -s -Wimplicit-function-declaration -Wall \
+ -I$(BASE)/include/trace tdump.c util.c -o tdump.exe
+
+jdump.exe: jdump.c util.c
+ gcc -s -Wimplicit-function-declaration -Wall \
+ -I$(BASE)/include/trace jdump.c util.c -o jdump.exe
+
+sa.exe: sa.c util.c distr.c
+ gcc -s -Wimplicit-function-declaration -Wall \
+ -I$(BASE)/include/trace sa.c util.c -o sa.exe
+
+road.exe: road.c util.c distr.c
+ gcc -s -Wimplicit-function-declaration -Wall \
+ -I$(BASE)/include/trace road.c util.c -o road.exe
+
+wait.exe: wait.c util.c distr.c
+ gcc -s -Wimplicit-function-declaration -Wall \
+ -I$(BASE)/include/trace wait.c util.c -o wait.exe
+
+
+
+#include $(BASE)/config/example.mk
+
+
+
+
+
+
Index: branches/pj/oldexamples/tracer/common.h
===================================================================
--- branches/pj/oldexamples/tracer/common.h (nonexistent)
+++ branches/pj/oldexamples/tracer/common.h (revision 1085)
@@ -0,0 +1,28 @@
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include <sys/types.h>
+
+/*
+#include <kernel/int_sem.h>
+#define SEM internal_sem_t
+#define sem_init internal_sem_init
+#define sem_signal internal_sem_post
+#define sem_wait internal_sem_wait
+*/
+
+#define SEM sem_t
+#define sem_signal sem_post
+
+extern __dev_t root_device;
+extern __dev_t temp_device;
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs);
+
+void showmessage(char *s);
+void waitend(void);
+
+#define FROMDIR "/TEMP"
+
+#endif
Index: branches/pj/oldexamples/kernel/test7.ori
===================================================================
--- branches/pj/oldexamples/kernel/test7.ori (nonexistent)
+++ branches/pj/oldexamples/kernel/test7.ori (revision 1085)
@@ -0,0 +1,244 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test7.ori,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 7:
+
+ this is a part of the classic Hartik demo Aster.
+
+ It checks:
+ - jet functions
+ - The EDF level with many task, with almost full bandwidth used
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules//edf.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+//#define PER_WCET 6200
+//#define CLOCK_WCET 100
+//#define ASTER_WCET 100
+#define PER_WCET 20000
+#define CLOCK_WCET 1000
+#define ASTER_WCET 1000
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; // 5000 + rand()%5000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ int r;
+ int x; // adaptive bandwidth...
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+
+ x = 64;
+
+ srand(7);
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ hard_task_def_arg(m,(void *)((rand() % 7)+1));
+ hard_task_def_mit(m, (x+r)*1000);
+ p = task_create("aaa",asteroide,&m,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+ NRT_TASK_MODEL m_nrt;
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt,1);
+ nrt_task_def_ctrl_jet(m_nrt);
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ exit(-1);
+ }
+
+ p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ exit(-1);
+ }
+
+ group_activate(1);
+
+ {
+ struct timespec t;
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_sec < 6);
+ }
+ //sys_status(SCHED_STATUS);
+ sys_end();
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/perf1.c
===================================================================
--- branches/pj/oldexamples/kernel/perf1.c (nonexistent)
+++ branches/pj/oldexamples/kernel/perf1.c (revision 1085)
@@ -0,0 +1,186 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: perf1.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Performance test 1:
+
+ there is one RR task that is preempted N_EDF times by an EDF task.
+
+ the test prints the differences of the execution time.
+
+ the test have to be compiled with the one shot timer, and it does not
+ use any init file.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#define TIMESPEC_N 100
+#define RR_N 1000000000
+#define EDF_N 2500
+
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(1000*1000*1000, RR_MAIN_NO, mb);
+ RR_register_level(10000, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ return 300;
+}
+
+void *crash_RR(void *arg);
+void *crash_EDF(void *arg);
+
+void *__init__(void *arg)
+{
+ int i;
+
+ PID p1,p2;
+
+ HARD_TASK_MODEL m_hard;
+ NRT_TASK_MODEL m_nrt;
+
+ TIME t[TIMESPEC_N];
+
+ // JET data
+ TIME sum, max, curr;
+ int nact;
+
+
+
+ hard_task_default_model(m_hard);
+ hard_task_def_mit (m_hard,2000);
+ hard_task_def_wcet (m_hard,1000);
+ hard_task_def_group (m_hard,1);
+ hard_task_def_ctrl_jet (m_hard);
+
+ nrt_task_default_model (m_nrt);
+ nrt_task_def_group (m_nrt,1);
+ nrt_task_def_ctrl_jet (m_nrt);
+
+ p1 = task_create("crash_EDF",crash_EDF,&m_hard,NULL);
+ if (p1 == -1) {
+ perror("Could not create task <crask_EDF> ...");
+ sys_end();
+ }
+
+ p2 = task_create("crash_RR",crash_RR,&m_nrt,NULL);
+ if (p2 == -1) {
+ perror("Could not create task <crask_RR> ...");
+ sys_end();
+ }
+
+ kern_cli();
+ /* timespec read time */
+ for (i=0; i<TIMESPEC_N; i++) {
+ t[i] = ll_gettime(TIME_EXACT, NULL);
+ }
+ kern_sti();
+
+ kern_printf("\n");
+ for (i=0; i<TIMESPEC_N; i++) {
+ kern_printf("%d: %ld Û", i, t[i]);
+ }
+ kern_printf("\n");
+
+ task_activate(p2);
+
+ jet_getstat(p2, &sum, &max, &nact, &curr);
+ kern_printf("RR test (alone): sum=%ld, max=%ld, nact=%d, curr=%ld\n",
+ sum, max, nact, curr);
+ jet_delstat(p2);
+
+ group_activate(1);
+
+ jet_getstat(p2, &sum, &max, &nact, &curr);
+ kern_printf("\nRR test : sum=%ld, max=%ld, nact=%d, curr=%ld\n",
+ sum, max, nact, curr);
+ jet_getstat(p1, &sum, &max, &nact, &curr);
+ kern_printf("EDF test : sum=%ld, max=%ld, nact=%d, curr=%ld\n",
+ sum, max, nact, curr);
+
+ sys_end();
+
+ return 0;
+}
+
+void *crash_RR(void *arg)
+{
+ int i;
+
+ for (;;) {
+ for (i=0; i<RR_N; i++);
+ task_sleep();
+ }
+ return 0;
+}
+
+void *crash_EDF(void *arg)
+{
+ int i;
+
+ for (;;) {
+ for (i=0; i<EDF_N; i++)
+ task_endcycle();
+ task_sleep();
+ }
+ return 0;
+}
+
+// not used!!!
+int main(int argc, char **argv)
+{
+ return 0;
+}
+
+
+
+
Index: branches/pj/oldexamples/kernel/perf2.c
===================================================================
--- branches/pj/oldexamples/kernel/perf2.c (nonexistent)
+++ branches/pj/oldexamples/kernel/perf2.c (revision 1085)
@@ -0,0 +1,401 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: perf2.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Performance Test 2:
+
+ This test tries to measure the time spent into the event handlers.
+ It is based on test D.
+
+ WARNING: the symbol __PERF_TEST2__ must be defined into the file
+ kernel/config.h
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 8200
+#define APER_WCET 20400
+#define CLOCK_WCET 1600
+#define ASTER_WCET 1600
+#define SOFT_MET 3300
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+int shutting_down = 0;
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = c;
+ puts_xy(i,y,rand()%15+1,s);
+
+ if (shutting_down) {
+ kern_printf("±%d±",exec_shadow);
+ return 0;
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = 1;
+ puts_xy(i,y,rand()%15+1,s);
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ hard_task_def_mit(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+
+ x = 64;
+
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
+ (proc_table[p].pclass & 0xFF00) == HARD_PCLASS) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ if (proc_table[p].task_level == 4)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+void fine()
+{
+ sys_end();
+}
+
+void exiting(void *arg)
+{
+ kern_printf("EXITING");
+ shutting_down = 1;
+}
+
+TIME perftime_prol[10001];
+TIME perftime_epil[10001];
+int perftime_count = 0;
+
+void perftest_stat(void *arg)
+{
+ int i;
+ TIME d, sum=0, max=0;
+
+ for (i=0; i<9000; i++) {
+ d = perftime_epil[i]-perftime_prol[i];
+ sum += d;
+ if (max < d) max = d;
+ kern_printf("Û%ld %ldÛ",perftime_epil[i],perftime_prol[i]);
+ }
+ kern_printf("\n°°° perftime_count=%u sum=%lu max=%lu °°°\n",perftime_count, sum, max);
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+// NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+ int i;
+ struct timespec fineprg;
+
+ kern_cli();
+
+ kern_sti();
+
+ sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
+ sys_atrunlevel(perftest_stat, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+// nrt_task_default_model(m_nrt);
+// nrt_task_def_group(m_nrt,1);
+// nrt_task_def_ctrl_jet(m_nrt);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,1000);
+ soft_task_def_period(m_soft,100000);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_wcet(m_aper,APER_WCET);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_system(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ soft_task_def_level(m_aper, i/4 + 2);
+ soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+
+ task_nopreempt();
+ fineprg.tv_sec = 60;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/perf3.c
===================================================================
--- branches/pj/oldexamples/kernel/perf3.c (nonexistent)
+++ branches/pj/oldexamples/kernel/perf3.c (revision 1085)
@@ -0,0 +1,434 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: perf3.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Performance Test 3:
+
+ this test is based on test D.
+
+ the test creates some random events. each event measure the difference
+ beetween his activation time and thecurrent time.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 8200
+#define APER_WCET 20400
+#define CLOCK_WCET 1600
+#define ASTER_WCET 1600
+#define SOFT_MET 3300
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+int shutting_down = 0;
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = c;
+ puts_xy(i,y,rand()%15+1,s);
+
+ if (shutting_down) {
+ kern_printf("±%d±",exec_shadow);
+ return 0;
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = 1;
+ puts_xy(i,y,rand()%15+1,s);
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ hard_task_def_mit(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+
+ x = 64;
+
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
+ ((proc_table[p].pclass & 0xFF00) == HARD_PCLASS)) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ if (proc_table[p].task_level == 4)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+void fine()
+{
+ sys_end();
+}
+
+void exiting(void *arg)
+{
+ kern_printf("EXITING");
+ shutting_down = 1;
+}
+
+
+
+
+
+struct timespec last_random_time;
+TIME max=0;
+TIME sum=0;
+int n=0;
+
+void random_event(void *arg)
+{
+ struct timespec t, sub;
+ TIME delta;
+
+ // get the current time
+ ll_gettime(TIME_EXACT, &t);
+
+ // compute the delta
+ SUBTIMESPEC(&t, &last_random_time, &sub);
+ delta = TIMESPEC2USEC(&sub);
+
+ // update the statistics
+ if (max < delta) max = delta;
+ sum += delta;
+ n++;
+
+/* kern_printf("sub=%d.%d t=%d.%d last=%d.%d °\n",sub.tv_sec, sub.tv_nsec/1000,
+ t.tv_sec, t.tv_nsec/1000,
+ last_random_time.tv_sec, last_random_time.tv_nsec/1000);
+*/ //return;
+ // create a new event
+ if (shutting_down)
+ return;
+
+ delta = (rand()%30000)+100;
+ ADDUSEC2TIMESPEC(delta, &t);
+ TIMESPEC_ASSIGN(&last_random_time, &t);
+ kern_event_post(&last_random_time, random_event, NULL);
+}
+
+void perftest_printdata(void *arg)
+{
+ kern_printf("\n°°° max=%ld sum=%ld n=%d °°°",max,sum,n);
+}
+
+int main(int argc, char **argv)
+{
+ PID p2; //p1,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+// NRT_TASK_MODEL m_nrt;
+ // SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+ int i;
+ struct timespec fineprg;
+
+ sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
+ sys_atrunlevel(perftest_printdata, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ kern_printf("\n\n");
+
+ srand(1234);
+ NULL_TIMESPEC(&last_random_time);
+ i = rand()%30000+2000;
+ ADDUSEC2TIMESPEC(i, &last_random_time);
+// last_random_time.tv_sec = 2;
+// last_random_time.tv_nsec = 0;
+ kern_cli();
+ kern_event_post(&last_random_time, random_event, NULL);
+ kern_sti();
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+// nrt_task_default_model(m_nrt);
+// nrt_task_def_group(m_nrt,1);
+// nrt_task_def_ctrl_jet(m_nrt);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,1000);
+ soft_task_def_period(m_soft,100000);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+/*
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+*/
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+/*
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_wcet(m_aper,APER_WCET);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_system(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ soft_task_def_level(m_aper, i/4 + 2);
+ soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+*/
+ task_nopreempt();
+ fineprg.tv_sec = 6;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/testa.c
===================================================================
--- branches/pj/oldexamples/kernel/testa.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testa.c (revision 1085)
@@ -0,0 +1,308 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testa.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 10 (A):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 7, with the use of TBS to serve a set of aperiodic
+ tasks.
+
+ There are APER_MAX tasks sleeping, and when an asteroide task finish
+ the current activation, it activate also an aperiodic task chosen
+ randomly (if the task chosen is already active, the task_activate do
+ nothing!)
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules//edf.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define APER_MAX 8
+
+#define PER_WCET 6200
+#define APER_WCET 18400
+#define CLOCK_WCET 200
+#define ASTER_WCET 200
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = c;
+ puts_xy(i,y,rand()%15+1,s);
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ int r;
+ int x; // adaptive bandwidth...
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+
+ x = 64;
+
+ srand(7);
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ hard_task_def_arg(m,(void *)((rand() % 7)+1));
+ hard_task_def_mit(m, (x+r)*1000);
+ p = task_create("aaa",asteroide,&m,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ task_endcycle();
+ }
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2;//,p3,p4,p5,p6;
+ HARD_TASK_MODEL m;
+ NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ int i;
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt,1);
+ nrt_task_def_ctrl_jet(m_nrt);
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_wcet(m_aper,APER_WCET);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_system(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ soft_task_def_level(m_aper, 2);
+ aper_table[0] = task_create("JetControl",jetcontrol,&m_aper,NULL);
+ if (aper_table[0] == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ for (i=1; i<APER_MAX; i++) {
+ soft_task_def_level(m_aper, i/4 + 2);
+ soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+
+
+ group_activate(1);
+
+ {
+ struct timespec t;
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_sec < 6);
+ }
+ //sys_status(SCHED_STATUS);
+ sys_end();
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/perf4.c
===================================================================
--- branches/pj/oldexamples/kernel/perf4.c (nonexistent)
+++ branches/pj/oldexamples/kernel/perf4.c (revision 1085)
@@ -0,0 +1,112 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: perf4.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Performance test 1:
+
+ there is one RR task that is preempted N_EDF times by an EDF task.
+
+ the test prints the differences of the execution time.
+
+ the test have to be compiled with the one shot timer, and it does not
+ use any init file.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+#include "modules/pi.h"
+
+#define TIMESPEC_N 100
+#define RR_N 1000000000
+#define EDF_N 2500
+
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(1000*1000*1000, RR_MAIN_NO, mb);
+ RR_register_level(10000, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ PI_register_module();
+
+ return 1200;
+}
+
+void *crash_RR(void *arg);
+void *crash_EDF(void *arg);
+
+void *__init__(void *arg)
+{
+ TIME t1, t2;
+ PI_mutexattr_t a;
+ mutex_t m1;
+ int i;
+
+ PI_mutexattr_default(a);
+
+ mutex_init(&m1, &a);
+
+ t1 = sys_gettime(NULL);
+ for (i=0; i<1000; i++) {
+ mutex_lock(&m1);
+ mutex_unlock(&m1);
+ }
+ t2 = sys_gettime(NULL);
+
+ kern_printf("t1=%ld, t2=%ld\n",t1,t2);
+
+ return 0;
+}
+
+// not used !!!
+int main(int argc, char **argv)
+{
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testb.c
===================================================================
--- branches/pj/oldexamples/kernel/testb.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testb.c (revision 1085)
@@ -0,0 +1,244 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testb.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 11 (B):
+
+ CBS test, similar to Test 10
+
+ There are 4 CBS aperiodic tasks and 1 periodic task.
+ after 5 secs, there is another activation of two of the four tasks.
+ at sec. 10 the test stops.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#if !defined(__TEST1__)
+ THE TEST REQUIRE THE DEFINITION __TEST1__ IN CONFIG.C
+#endif
+
+struct timespec s_stime[10000];
+struct timespec s_send[10000];
+TIME s_curr[10000];
+PID s_PID[10000];
+int useds=0;
+int testactive=1;
+
+
+TASK pippo()
+{
+ int i;
+ struct timespec t;
+ int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_nsec <= 30000000L);
+}
+
+TASK pippo2()
+{
+ int i;
+ struct timespec t;
+ int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ } while (t.tv_nsec <= 30000000L);
+}
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 15;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ task_endcycle();
+
+ if (i==7) testactive = 0;
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper(void *a)
+{
+ int i;
+ int y;
+
+ int load1,j;
+
+ char s[2];
+
+ y = (int) a;
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 600000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ int i;
+ NRT_TASK_MODEL m;
+ HARD_TASK_MODEL m_per;
+ SOFT_TASK_MODEL m_aper;
+ PID p1, p2, p3, p4, p5;
+ int k=1;
+
+ srand(7);
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ p1 = task_create("pippo", pippo, &m, NULL);
+ if (p1 == NIL)
+ { kern_printf("Can't create pippo task...\n"); }
+
+ p2 = task_create("pippo2", pippo2, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); }
+
+ hard_task_default_model(m_per);
+ hard_task_def_mit(m_per,15000);
+ hard_task_def_wcet(m_per,6200);
+ hard_task_def_group(m_per,1);
+ p3 = task_create("asteroide", asteroide, &m_per, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create asteroide task...\n"); }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_met(m_aper,10000);
+ soft_task_def_period(m_aper,100000);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_system(m_aper);
+ soft_task_def_arg(m_aper, 14);
+ soft_task_def_aperiodic(m_aper);
+ p4 = task_create("aper", aper, &m_aper, NULL);
+ if (p4 == NIL)
+ { kern_printf("Can't create aper task...\n"); }
+
+ soft_task_def_arg(m_aper, 13);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); }
+
+ soft_task_def_arg(m_aper, 12);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); }
+
+ soft_task_def_arg(m_aper, 11);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); }
+
+// kern_printf("p1=%d p2=%d p3=%d p4=%d\n",p1,p2,p3,p4);
+ group_activate(1);
+
+
+// task_kill(p2);
+ i = 1;
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (i && t.tv_sec == 5) {
+ task_activate(p4);
+ task_activate(p5);
+ i = 0;
+ }
+
+// task_kill(p3);
+ } while (t.tv_sec < 10);
+ testactive = 0;
+
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<useds; i++)
+ kern_printf("%6d: pid %-9d stime %-9d reschedule %-9d avail %-9d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testc.c
===================================================================
--- branches/pj/oldexamples/kernel/testc.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testc.c (revision 1085)
@@ -0,0 +1,260 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testc.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 12 (C):
+
+ CBS test, similar to Test 11
+
+ then at start time two task are started, one of them
+ calling task_nopreempt. when the task releases, the other exec all
+ the pending activations.
+ at sec. 4 the test stops.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+TASK pippo()
+{
+// int i;
+ struct timespec t;
+// int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_nsec <= 30000000L);
+ return 0;
+}
+
+TASK pippo2()
+{
+// int i;
+ struct timespec t;
+// int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ } while (t.tv_nsec <= 30000000L);
+ return 0;
+}
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 15;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+// if (i==7) testactive = 0;
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+ return 0;
+}
+
+TASK aper(void *a)
+{
+ int i;
+ int y;
+
+ int load1,j;
+
+ char s[2];
+
+ y = (int) a;
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 600000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+ return 0;
+}
+
+
+TASK per(void)
+{
+ int i;
+ int y = rand() % 7 + 15;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 1000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+// if (i==7) testactive = 0;
+
+ //puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+ return 0;
+}
+
+TASK stoppa()
+{
+ struct timespec t;
+
+ task_nopreempt();
+ kern_printf("\nTask nopreempt");
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_sec < 3);
+ kern_printf("\nTask preempt");
+ task_preempt();
+ kern_printf("\nFine STOPPA");
+ return 0;
+}
+
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ int i;
+ NRT_TASK_MODEL m;
+// HARD_TASK_MODEL m_per;
+ SOFT_TASK_MODEL m_aper;
+ PID p8, p9; //p1, p2, p3, p4, p5, p6, p7,
+
+// int k=1;
+
+ srand(7);
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ soft_task_default_model(m_aper);
+ soft_task_def_met(m_aper,10000);
+ soft_task_def_period(m_aper,100000);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_system(m_aper);
+ soft_task_def_arg(m_aper, (void *)14);
+ soft_task_def_aperiodic(m_aper);
+// soft_task_def_skip_arrivals(m_aper);
+
+ soft_task_def_periodic(m_aper);
+ p8 = task_create("per", per, &m_aper, NULL);
+ if (p8 == NIL)
+ { kern_printf("Can't create per task...\n"); }
+
+ p9 = task_create("stoppa", stoppa, &m, NULL);
+ if (p9 == NIL)
+ { kern_printf("Can't create stoppa task...\n"); }
+
+ task_activate(p8);
+
+ i = 0;
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (i == 0 && t.tv_sec == 1 && t.tv_nsec >= 0) {
+ task_activate(p9);
+ i = 1;
+ }
+ } while (t.tv_sec < 10);
+/*
+ testactive = 0;
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<useds; i++)
+ kern_printf("%6d: pid %-9d stime %-9d reschedule %-9d avail %-9d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+*/
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testd.c
===================================================================
--- branches/pj/oldexamples/kernel/testd.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testd.c (revision 1085)
@@ -0,0 +1,381 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testd.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 13 (D):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 10 (A), and use the CBS to serve the periodic tasks.
+
+ There still remain some periodic tasks, that are guaranteed basing on their
+ wcet.
+
+ It also tests the shutdown...
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 25000
+#define APER_WCET 53000
+#define CLOCK_WCET 1000
+#define ASTER_WCET 1000
+#define SOFT_MET 6300
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+int shutting_down = 0;
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = c;
+ puts_xy(i,y,rand()%15+1,s);
+
+ if (shutting_down) {
+ kern_printf("±%d±",exec_shadow);
+ return 0;
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = 1;
+ puts_xy(i,y,rand()%15+1,s);
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ hard_task_def_mit(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+
+ x = 64;
+
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
+ (proc_table[p].pclass & 0xFF00) == HARD_PCLASS) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ if (proc_table[p].task_level == 4)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+void fine()
+{
+ sys_end();
+}
+
+void exiting(void *arg)
+{
+ kern_printf("EXITING");
+ shutting_down = 1;
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+// NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+ int i;
+ struct timespec fineprg;
+
+ sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+// nrt_task_default_model(m_nrt);
+// nrt_task_def_group(m_nrt,1);
+// nrt_task_def_ctrl_jet(m_nrt);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,1000);
+ soft_task_def_period(m_soft,100000);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_wcet(m_aper,APER_WCET);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_system(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ soft_task_def_level(m_aper, i/4 + 2);
+ soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+
+ task_nopreempt();
+ fineprg.tv_sec = 6;
+ fineprg.tv_nsec = 0;
+// kern_event_post(&fineprg,fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/teste.c
===================================================================
--- branches/pj/oldexamples/kernel/teste.c (nonexistent)
+++ branches/pj/oldexamples/kernel/teste.c (revision 1085)
@@ -0,0 +1,115 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: teste.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 14 (E):
+
+ this test is a simple main() function with one other task.
+
+ This test verify the correctness of the sem module.
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#include <modules/sem.h>
+
+sem_t s;
+
+TASK pippo(void *a)
+{
+ int i=0;
+ struct timespec t;
+// int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (i==0 && t.tv_sec == (int)a) {
+ i = 1;
+ kern_printf("before sem_wait %d\n",(int)a);
+ sem_wait(&s);
+ kern_printf("after sem_wait %d\n",(int)a);
+ }
+
+ if (i==1 && t.tv_sec == 2+(int)a) {
+ i = 2;
+ kern_printf("before sem_post %d\n",(int)a);
+ sem_post(&s);
+ kern_printf("after sem_post %d\n",(int)a);
+ return 0;
+ }
+
+
+ } while (1);
+}
+
+int main(int argc, char **argv)
+{
+// struct timespec t;
+// int i;
+ NRT_TASK_MODEL m;
+ PID p2,p3;
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ nrt_task_def_arg(m,(void *)1);
+ p2 = task_create("pippo1", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo1 task...\n"); return 1; }
+
+ nrt_task_def_arg(m,(void *)2);
+ p3 = task_create("pippo2", pippo, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ sem_init(&s,0,1);
+
+ group_activate(1);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testf.c
===================================================================
--- branches/pj/oldexamples/kernel/testf.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testf.c (revision 1085)
@@ -0,0 +1,128 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testf.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 15 (F):
+
+ This test verify the correctness of the PI module.
+
+
+ the main task (NRT) lock a PI mutex.
+ then 2 tasks arrives, with priority higher than the main
+
+ the first try to lock the mutex, but it can't, so the main inherit
+ his priority. The second simply prints a string.
+
+ If all works, the string of the second task is printed after the end of
+ the first task.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+mutex_t m1;
+
+
+TASK pippo1(void *a)
+{
+// int i=0;
+// struct timespec t;
+// int last = 0;
+
+ kern_printf("pippo1 prima di mutex_lock\n");
+ mutex_lock(&m1);
+ kern_printf("pippo1 dopo mutex_lock\n");
+
+ mutex_unlock(&m1);
+ kern_printf("pippo1 dopo mutex_unlock\n");
+ return 0;
+}
+
+TASK pippo2()
+{
+ kern_printf("pippo2 Dentro pippo2\n");
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+// struct timespec t;
+// int i;
+ HARD_TASK_MODEL m;
+ PID p2,p3;
+
+ PI_mutexattr_t a;
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m,50000);
+ hard_task_def_wcet(m,10000);
+ hard_task_def_group(m,1);
+
+ hard_task_def_arg(m,(void *)1);
+ p2 = task_create("pippo1", pippo1, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo1 task...\n"); return 1; }
+
+ hard_task_def_mit(m,100000);
+ p3 = task_create("pippo2", pippo2, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ PI_mutexattr_default(a);
+ mutex_init(&m1,&a);
+
+ kern_printf("main prima di mutex_lock\n");
+ mutex_lock(&m1);
+ kern_printf("main dopo mutex_lock, exec=%d, exec_shadow=%d\n", exec, exec_shadow);
+
+ group_activate(1);
+
+ kern_printf("main dopo group_activate, exec=%d, exec_shadow=%d\n", exec, exec_shadow);
+ mutex_unlock(&m1);
+ kern_printf("main dopo mutex_unlock\n");
+
+ mutex_destroy(&m1);
+ kern_printf("main dopo mutex_destroy\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testg.c
===================================================================
--- branches/pj/oldexamples/kernel/testg.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testg.c (revision 1085)
@@ -0,0 +1,485 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testg.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test 16 (G):
+
+ This is a part of the cbsmouse.c Hartik's example.
+
+ It only prints the task scheduling in graphic mode...
+
+ There is a parameter to choose the type of scheduling module
+ to initialize.
+
+ to init correctly the module and task bandwidth parameters, set the defines
+ NUM and DEN in initg.c and testg.c and remember the "s" (soft) parameter!!!
+
+ to plot the deadlines assigned by CBS or TBS, compile cbs.c or tbs.c with
+ the TESTG define
+ (gray dots over the mouse line are the deadlines, green dots are CBS
+ shifts)
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/glib.h"
+#include "drivers/keyb.h"
+#include "drivers/mouse.h"
+
+/*--------------------------------------------------------------*/
+/* TEST ON EDF SCHEDULING */
+/*--------------------------------------------------------------*/
+
+#define LMOUSE 20
+#define LM 40 /* line of main */
+#define OFFSET 20 /* initial phase */
+#define CHAR_DIM 8 /* Height of chars in pixels */
+
+int col[3] = {2, 4, 14}; /* colors of timelines */
+int lev[3] = {80, 120, 160}; /* level of timelines */
+int ptime[3] = {10, 20, 25}; /* number of cycles */
+int period[3] = {40, 50,100}; /* tasks' periods */
+int tick = 1; /* system tick */
+int tscale = 1; /* time scale */
+TIME starttime = 0; /* Simulation start time (scaled) */
+
+char *title; /* used in initg.c */
+
+/* period[] is scaled with a factor of PERIODSCALE usec */
+#define PERIODSCALE 5000
+
+// update also initg.c!!!
+#define NUM 200
+#define DEN 64000
+
+//SEM mutex; /* Semaphore for graphix*/
+
+//#define IY(y) (480 - y)
+#define IY(y) y
+
+/*
+ * mouse cursor
+ *
+ */
+
+#define W WHITE
+#define R RED
+#define G GREEN
+#define M MAGENTA
+
+/* shape */
+
+BYTE mycursor[16*16]= {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,W,W,W,W,0,0,0,0,0,0,W,W,W,W,0,
+ 0,W,M,0,0,0,0,0,0,0,0,0,0,M,W,0,
+ 0,W,0,M,0,0,0,0,0,0,0,0,M,0,W,0,
+ 0,W,0,0,M,0,0,0,0,0,0,M,0,0,W,0,
+ 0,0,0,0,0,M,0,0,0,0,M,0,0,0,0,0,
+ 0,0,0,0,0,0,G,G,G,G,0,0,0,0,0,0,
+ 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
+ 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
+ 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
+ 0,0,0,0,0,0,G,G,G,G,0,0,0,0,0,0,
+ 0,0,0,0,0,0,M,M,M,M,0,0,0,0,0,0,
+ 0,0,0,0,0,0,M,M,M,M,0,0,0,0,0,0,
+ 0,0,0,0,0,M,M,M,M,M,M,0,0,0,0,0,
+ 0,0,0,0,M,M,M,M,M,M,M,M,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+#define F 0xff
+#define B 0x00
+
+/* mask */
+BYTE mybkg[16*16]= {
+ B,B,B,B,B,B,F,F,F,F,B,B,B,B,B,B,
+ B,0,0,0,0,B,F,F,F,F,B,0,0,0,0,B,
+ B,0,0,B,B,F,F,F,F,F,B,B,B,0,0,B,
+ B,0,B,0,B,F,F,F,F,F,F,B,0,B,0,B,
+ B,0,B,B,0,B,F,F,F,F,B,0,B,B,0,B,
+ B,B,B,F,B,0,B,B,B,B,0,B,F,B,B,B,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,B,0,0,0,0,0,0,B,F,F,F,F,
+ F,F,F,B,0,0,0,0,0,0,0,0,B,F,F,F,
+ F,F,F,B,B,B,B,B,B,B,B,B,B,F,F,F,
+};
+
+#undef B
+#define B 0xff
+
+/* bad mask */
+BYTE mybadbkg[16*16]= {
+ B,B,B,B,B,B,F,F,F,F,B,B,B,B,B,B,
+ B,0,0,0,0,B,F,F,F,F,B,0,0,0,0,B,
+ B,0,0,B,B,F,F,F,F,F,B,B,B,0,0,B,
+ B,0,B,0,B,F,F,F,F,F,F,B,0,B,0,B,
+ B,0,B,B,0,B,F,F,F,F,B,0,B,B,0,B,
+ B,B,B,F,B,0,B,B,B,B,0,B,F,B,B,B,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
+ F,F,F,F,B,0,0,0,0,0,0,B,F,F,F,F,
+ F,F,F,B,0,0,0,0,0,0,0,0,B,F,F,F,
+ F,F,F,B,B,B,B,B,B,B,B,B,B,F,F,F,
+};
+
+/* very bad mask */
+BYTE myverybadbkg[16*16]= {
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+ F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+};
+
+
+/*--------------------------------------------------------------*/
+/* Prints a grid to show task periods during execution */
+/*--------------------------------------------------------------*/
+
+void print_grid()
+{
+ int i;
+ int a1, a2, a3;
+ int temp;
+// char str[50];
+
+ a1 = 0;
+ a2 = 0;
+ a3 = 0;
+ temp = 0;
+
+ grx_text(title, 0, 240-10 ,10, 0);
+
+ grx_line(OFFSET, lev[0], 639, lev[0], 5);
+ grx_line(OFFSET, lev[1], 639, lev[1], 5);
+ grx_line(OFFSET, lev[2], 639, lev[2], 5);
+ grx_text("T1", 0, lev[0]-8, 9, 0);
+ grx_text("T2", 0, lev[1]-8, 9, 0);
+ grx_text("T3", 0, lev[2]-8, 9, 0);
+ grx_text("MA", 0, LM, 8, 0);
+ grx_text("MO", 0, LMOUSE, 8, 0);
+
+ for (i = OFFSET; i < 640; i++) {
+ if (temp >= a1) {
+ grx_line(i, lev[0] - 1, i, lev[0] - 20, 3);
+ a1 += period[0];
+ }
+ if (temp >= a2) {
+ grx_line(i, lev[1] - 1, i, lev[1] - 20, 3);
+ a2 += period[1];
+ }
+ if (temp >= a3) {
+ grx_line(i, lev[2] - 1, i, lev[2] - 20, 3);
+ a3 += period[2];
+ }
+ temp += tick/tscale;
+ }
+}
+
+/*--------------------------------------------------------------*/
+/* This function is called at system termination */
+/*--------------------------------------------------------------*/
+
+void my_end()
+{
+ grx_close();
+// sys_status(0xFFFF);
+// sys_end();
+}
+
+/*--------------------------------------------------------------*/
+/* GENERIC PERIODIC PROCESS */
+/*--------------------------------------------------------------*/
+
+TASK color(int k)
+{
+ int i;
+ DWORD x = OFFSET;
+ TIME t;
+ while ( x < 640L) {
+ for (i = 0; i < ptime[k]; i++) {
+
+ t = sys_gettime(NULL) / PERIODSCALE;
+ x = (t - starttime) + OFFSET;
+ if (x>=640) break;
+ //sem_wait(mutex, BLOCK);
+ kern_cli();
+ grx_plot(x, lev[k] - 4, col[k]);
+ grx_plot(x, lev[k] - 5, col[k]);
+ grx_plot(x, lev[k] - 6, col[k]);
+ grx_plot(x, lev[k] - 7, col[k]);
+ //sem_signal(mutex);
+ kern_sti();
+ while (sys_gettime(NULL)/PERIODSCALE == t);
+ }
+ task_endcycle();
+ }
+ return 0;
+}
+
+void my_mouse_handler(MOUSE_EVT *ev)
+{
+ int x;
+
+ x = (sys_gettime(NULL)/PERIODSCALE - starttime) + OFFSET;
+ if (x>=640) return;
+ //sem_wait(mutex, BLOCK);
+ grx_plot(x, LMOUSE, 8);
+ //while (sys_ticks()==s);
+ //sem_signal(mutex);
+}
+
+/*--------------------------------------------------------------*/
+/* MAIN PROCESS */
+/*--------------------------------------------------------------*/
+
+int main(int argc, char *argv[])
+{
+ int i;
+ int x = OFFSET;
+
+ MOUSE_PARMS mouse = BASE_MOUSE;
+ HARD_TASK_MODEL mouse_hard;
+ SOFT_TASK_MODEL mouse_soft;
+ NRT_TASK_MODEL mouse_nrt;
+
+ char c;
+ KEY_EVT emerg;
+
+ HARD_TASK_MODEL m_per;
+ int modenum;
+
+ //sys_def_nocheck(si);
+ //sys_def_tick(si, tick, mSec);
+ //sys_init(&si);
+
+ //cprintf("Sys GetTick... %lu 100000 / sys_tick: %lu \n", sys_gettick(), 100000 / sys_gettick());
+
+ if (argc>=3)
+ switch(*argv[2]) {
+ case 'h':
+ /* this is not correct, because it don't remember activations */
+ hard_task_default_model(mouse_hard);
+ hard_task_def_mit(mouse_hard,DEN);
+ hard_task_def_wcet(mouse_hard,NUM);
+ hard_task_def_system(mouse_hard);
+ hard_task_def_aperiodic(mouse_hard);
+ mouse_def_task(mouse,(TASK_MODEL *)&mouse_hard);
+ break;
+ case 's':
+ soft_task_default_model(mouse_soft);
+ soft_task_def_wcet(mouse_soft,NUM);
+ soft_task_def_met(mouse_soft,NUM);
+ soft_task_def_period(mouse_soft,DEN);
+ soft_task_def_system(mouse_soft);
+ soft_task_def_aperiodic(mouse_soft);
+ mouse_def_task(mouse,(TASK_MODEL *)&mouse_soft);
+ break;
+ case 'n':
+ /* this is not correct, because it don't remember activations */
+ nrt_task_default_model(mouse_nrt);
+ nrt_task_def_system(mouse_nrt);
+ mouse_def_task(mouse,(TASK_MODEL *)&mouse_nrt);
+ break;
+ default:
+ argc=0;
+ break;
+ }
+ mouse_def_ms(mouse,0);
+
+ if (argc>=4) {
+ period[0]=atoi(argv[3]);
+ if (period[0]<ptime[0]) period[0]=ptime[0]+5;
+ }
+ if (argc>=5) {
+ period[1]=atoi(argv[4]);
+ if (period[1]<ptime[1]) period[1]=ptime[1]+5;
+ }
+ if (argc>=6) {
+ period[2]=atoi(argv[5]);
+ if (period[2]<ptime[2]) period[2]=ptime[2]+5;
+ }
+
+ if (argc<2) {
+ cprintf("syntax: x testg <config> <mouse-task> [t1] [t2] [t3]\n");
+ cprintf("where <config> can be:\n");
+ cprintf("\t0 - EDF + CBS + RR\n");
+ cprintf("\t1 - RM + PS ( bkg, U=1/16) + RR, no check Ulub < 0.69\n");
+ cprintf("\t2 - RM + PS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n");
+ cprintf("\t3 - EDF + PS ( bkg, U=1/16) + RR\n");
+ cprintf("\t4 - EDF + PS (nobkg, U=1/16) + RR\n");
+ cprintf("\t5 - EDF + TBS( U=1/16) + RR\n");
+ cprintf("\t6 - RM + DS ( bkg, U=1/16) + RR, no check Ulub < 0.69\n");
+ cprintf("\t7 - RM + DS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n");
+ cprintf("\nwhere <mouse-task> can be:\n");
+ cprintf("\th - Hard\n");
+ cprintf("\ts - Soft (understimated wcet)\n");
+ cprintf("\tn - NRT\n");
+ sys_end();
+ return -1;
+ }
+
+ if (grx_init() == -1) {
+ cprintf("Error initing GraphLib!!!\n");
+ sys_end();
+ }
+ modenum = grx_getmode(640, 480, 8);
+ cprintf("Modenum :%d\n", modenum);
+
+ if (grx_setmode(modenum) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_end();
+ }
+ /* */
+// grx_close();
+ print_grid();
+ #define DX (640/5-1)
+ grx_box(DX*0,240,DX*1-1,479,GREEN);
+ grx_box(DX*1,240,DX*2-1,479,WHITE);
+ grx_box(DX*2,240,DX*3-1,479,RED);
+ grx_box(DX*3,240,DX*4-1,479,MAGENTA);
+ grx_box(DX*4,240,DX*5-1,479,BLACK);
+
+ for (i=0;i<3;i++) {
+ period[i]=period[i]*PERIODSCALE;
+ //ptime[i]=ptime[i] *PERIODSCALE; ptime is not scaled
+ }
+
+ sys_atrunlevel(my_end, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* mutex */
+// mutex = sem_create(1);
+
+ /* keyboard */
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,(void (*)(KEY_EVT *))sys_end);
+ keyb_getchar();
+
+ /* mouse */
+ mouse_init(&mouse);
+ mouse_limit(XMINLIMIT(640,480),
+ 240,
+ XMAXLIMIT(640,480),
+ YMAXLIMIT(640,480));
+ mouse_position(320,280);
+ mouse_threshold(2);
+ //grx_setcolor(255,255,255,255);
+ mouse_grxshape(mycursor,mybkg);
+ mouse_grxcursor(ENABLE);
+ mouse_on();
+ mouse_hook(my_mouse_handler);
+
+ /* hard task creation */
+
+ hard_task_default_model(m_per);
+ hard_task_def_mit(m_per,period[0]);
+ hard_task_def_wcet(m_per,ptime[0]*PERIODSCALE);
+ hard_task_def_group(m_per, 1);
+ //task_def_wcet(m, ptime[0] * sys_tick);
+ if (task_create("verde", color, &m_per, NULL) == -1) {
+ grx_close();
+ perror("Edf.C(main) Could not create <green>:");
+ sys_end();
+ l1_exit(-1);
+ }
+ hard_task_def_arg(m_per, (void *)1);
+ hard_task_def_wcet(m_per, ptime[1]*PERIODSCALE);
+ hard_task_def_mit(m_per,period[1]);
+ if (task_create("red", color, &m_per, NULL) == -1) {
+ grx_close();
+ perror("Edf.C(main) Could not create <red>:");
+ sys_end();
+ l1_exit(-1);
+ }
+ hard_task_def_arg(m_per, (void *)2);
+ hard_task_def_wcet(m_per, ptime[2]*PERIODSCALE);
+ hard_task_def_mit(m_per,period[2]);
+ if (task_create("yellow", color, &m_per, NULL) == -1) {
+ grx_close();
+ perror("Edf.C(main) Could not create <yellow>:");
+ sys_end();
+ l1_exit(-1);
+ }
+ starttime = sys_gettime(NULL) / PERIODSCALE;
+ group_activate(1);
+
+ /* main loop */
+ while (x < 640L) {
+ x = (sys_gettime(NULL)/PERIODSCALE - starttime) + OFFSET;
+ if (x>=640) break;
+ //sem_wait(mutex, BLOCK);
+ kern_cli();
+ grx_plot(x, LM, 7);
+ kern_sti(); // sem_signal(mutex);
+ }
+
+ c = keyb_getchar();
+ return 0;
+}
+
+/*--------------------------------------------------------------*/
Index: branches/pj/oldexamples/kernel/testh.c
===================================================================
--- branches/pj/oldexamples/kernel/testh.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testh.c (revision 1085)
@@ -0,0 +1,493 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testh.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 17 (h):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 13 (d), and use the CBS to serve the periodic tasks.
+
+ There are not periodic tasks, only CBS tasks.
+
+ The tasks use a PI, NPP or NOP mutex to access the video memory.
+
+ A flag (LONGSC) is provided to try long and short critical sections.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "drivers/keyb.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 6200
+#define APER_WCET 18400
+#define JET_WCET 10000
+#define JET_PERIOD 100000
+
+#define APER_REP 22000
+
+//PID aper_table[APER_MAX];
+
+mutex_t m1;
+
+
+#define PIMUTEX
+//#define NPPMUTEX
+//#define NOPMUTEX
+
+#define LONGSC
+
+#ifdef LONGSC
+#define SOFT_MET 3000 /* 3000 12000 */
+#define CLOCK_WCET 400 /* 200 300*/
+#define ASTER_WCET 400 /* 200 300*/
+#else
+#define SOFT_MET 80000 /* 4500 */
+#define CLOCK_WCET 2000 /* 200*/
+#define ASTER_WCET 2000 /* 200*/
+#endif
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ #ifdef LONGSC
+ mutex_unlock(&m1);
+ #endif
+
+// task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = c;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = 1;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+// task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+// HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+/* periodic_task_default_model(m,0,PER_WCET);
+ periodic_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ periodic_task_def_period(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+*/
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+
+ x = 128; //64;
+
+ while (1) {
+/* {
+ PID p;
+ int x;
+ p = level_table[0]->level_scheduler(0);
+ printf_xy(1,8,WHITE," ");
+
+ x = 0;
+ do {
+ printf_xy(3*x+1,8,WHITE,"%3d",p);
+ p = proc_table[p].next;
+ x++;
+ } while (p != NIL);
+ }
+*/
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ mutex_unlock(&m1);
+ }
+ else {
+ num_aster++;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ mutex_unlock(&m1);
+
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
+
+ mutex_unlock(&m1);
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
+ mutex_unlock(&m1);
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ mutex_lock(&m1);
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ mutex_unlock(&m1);
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
+ (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
+ (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ mutex_lock(&m1);
+ if (proc_table[p].task_level == 2)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³p%-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)proc_table[p].status, (int)proc_table[p].shadow, (int)proc_table[p].timespec_priority.tv_sec,(int)proc_table[p].timespec_priority.tv_nsec/1000 , (int)last[3], (int)last[4]);
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3;//,p4,p5,p6;
+ HARD_TASK_MODEL m;
+// NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+// int i;
+ struct timespec fineprg;
+
+ #ifdef PIMUTEX
+ PI_mutexattr_t a;
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_t a;
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_t a;
+ #endif
+
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,100000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+// nrt_task_default_model(m_nrt);
+// nrt_task_def_group(m_nrt,1);
+// nrt_task_def_ctrl_jet(m_nrt);
+
+
+ soft_task_default_model(m_aper);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_period(m_soft,JET_PERIOD);
+ soft_task_def_met(m_soft,JET_WCET);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+/*
+ aperiodic_task_default_model(m_aper,APER_WCET);
+ aperiodic_task_def_ctrl_jet(m_aper);
+ aperiodic_task_def_system(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ aperiodic_task_def_level(m_aper, i/4 + 2);
+ aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+*/
+ task_nopreempt();
+
+ #ifdef PIMUTEX
+ PI_mutexattr_default(a);
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_default(a);
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_default(a);
+ #endif
+
+ mutex_init(&m1, &a);
+
+ fineprg.tv_sec = 1800;
+ fineprg.tv_nsec = 0;
+ //kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/testi.c
===================================================================
--- branches/pj/oldexamples/kernel/testi.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testi.c (revision 1085)
@@ -0,0 +1,234 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testi.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 18 (I):
+
+ This test verify the correctness of the PC module.
+
+ The test uses 3 mutexes
+ m0 with ceiling 0
+ m1 with ceiling 0
+ m2 with ceiling 1
+
+ the main task (NRT) creates three tasks.
+
+ J0 with PC priority 0
+ starts at t=1.5 sec and lock m0, unlock m0, then lock and unlock m1
+
+ J1 with PC priority 1
+ starts at t=0.5 sec and try to lock m2
+
+ J2 with PC priority 2
+ it starts and locks m2
+ at t=1 sec it locks m1
+ at t=1.5 sec it unlocks m1
+
+
+ The example is similar to the scheduling diagram shown at p. 197 of the
+ book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/keyb.h"
+
+mutex_t m0,m1,m2;
+
+
+TIME gt(void)
+{
+ TIME t;
+ kern_cli();
+ t = ll_gettime(TIME_EXACT,NULL);
+ kern_sti();
+ return t;
+}
+
+void startJ(void *a)
+{
+// task_activate((PID)a);
+ PID p = (PID) a;
+ LEVEL l;
+
+ kern_printf("startJ: %d\n",p);
+
+ l = proc_table[p].task_level;
+ level_table[l]->task_activate(l,p);
+ event_need_reschedule();
+}
+
+TASK j0()
+{
+ kern_printf("J0: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J0: locked m0\n");
+ mutex_unlock(&m0);
+ kern_printf("J0: unlocked m0, locking m1\n");
+
+ mutex_lock(&m1);
+ kern_printf("J0: locked m1\n");
+ mutex_unlock(&m1);
+ kern_printf("J0: unlocked m1, end task\n");
+ return 0;
+}
+
+
+TASK j1()
+{
+ kern_printf("J1: before locking m2\n");
+ mutex_lock(&m2);
+ kern_printf("J1: locked m2\n");
+ mutex_unlock(&m2);
+ kern_printf("J1: unlocked m2, end task\n");
+ return 0;
+}
+
+
+TASK j2()
+{
+// struct timespec t;
+ kern_printf("J2: before locking m2\n");
+ mutex_lock(&m2);
+ kern_printf("J2: locked m2, waiting to t=1 sec\n");
+
+ while (gt() < 1000000);
+
+ kern_printf("J2: t = 1 sec reached\n");
+ mutex_lock(&m1);
+ kern_printf("J2: locked m1, waiting to t=2 sec\n");
+
+ while (gt() < 2000000);
+
+ kern_printf("J2: t = 2 sec reached\n");
+ mutex_unlock(&m1);
+ kern_printf("J2: unlocked m1\n");
+
+ mutex_unlock(&m2);
+ kern_printf("J2: unlocked m2, end task\n");
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+
+ HARD_TASK_MODEL m;
+ PID p0,p1,p2;
+
+ PC_mutexattr_t a;
+ PI_mutexattr_t a2;
+ PC_RES_MODEL r;
+
+ KEY_EVT emerg;
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ /* ---------------------------------------------------------------------
+ Task creation
+ --------------------------------------------------------------------- */
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 1000000);
+ hard_task_def_wcet(m, 20000);
+ PC_res_default_model(r,0);
+ p0 = task_create("J0", j0, &m, &r);
+ if (p0 == NIL)
+ { kern_printf("Can't create J0 task...\n"); return 1; }
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 2100000);
+ hard_task_def_wcet(m, 20000);
+ PC_res_default_model(r,1);
+ p1 = task_create("J1", j1, &m, &r);
+ if (p1 == NIL)
+ { kern_printf("Can't create J1 task...\n"); return 1; }
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 10000000);
+ hard_task_def_wcet(m, 3000000);
+ PC_res_default_model(r,2);
+ p2 = task_create("J2", j2, &m, &r);
+ if (p2 == NIL)
+ { kern_printf("Can't create J2 task...\n"); return 1; }
+
+ /* ---------------------------------------------------------------------
+ Mutex creation
+ --------------------------------------------------------------------- */
+
+ PI_mutexattr_default(a2);
+ PC_mutexattr_default(a,0);
+ mutex_init(&m0,(mutexattr_t *)&a);
+ mutex_init(&m1,(mutexattr_t *)&a);
+
+ PC_mutexattr_default(a,1);
+ mutex_init(&m2,(mutexattr_t *)&a);
+
+ /* ---------------------------------------------------------------------
+ Event post
+ --------------------------------------------------------------------- */
+
+ t.tv_sec = 0;
+ t.tv_nsec = 500000000;
+// t.tv_nsec = 30000000;
+ kern_event_post(&t,startJ,(void *)p1);
+
+ t.tv_sec = 1;
+ kern_event_post(&t,startJ,(void *)p0);
+
+ task_activate(p2);
+
+ kern_printf("END main\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testj.c
===================================================================
--- branches/pj/oldexamples/kernel/testj.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testj.c (revision 1085)
@@ -0,0 +1,268 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testj.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 19 (J):
+
+ This test verify the correctness of the SRP module.
+
+ There are 3 taks, Jh, Jm, Jl that uses 3 mutexes m1, m2, m3
+
+ the main task (NRT) creates the three tasks.
+
+ Jh with preemption level 3
+ starts at t=1.5 sec and lock m3, lock m1, unlock m1, unlock m3
+
+ Jm with preemption level 2
+ starts at t=0.5 sec and lock m3, lock m2, unlock m2, unlock m3
+ then lock and unlock m1
+
+ Jl with preemption level 1
+ it starts and locks m2
+ at t=1 sec it locks m1
+ at t=1.5 sec it unlocks m1
+ then it unlocks m2, and finally it locks and unlocks m3
+
+
+ The example is similar to the scheduling diagram shown at p. 210 of the
+ book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/keyb.h"
+
+#include <modules//srp.h>
+
+mutex_t m1,m2,m3;
+
+
+TIME gt(void)
+{
+ TIME t;
+ kern_cli();
+ t = ll_gettime(TIME_EXACT,NULL);
+ kern_sti();
+ return t;
+}
+
+void startJ(void *a)
+{
+// task_activate((PID)a);
+ PID p = (PID) a;
+ LEVEL l;
+
+ kern_printf("startJ: %d\n",a);
+
+ l = proc_table[p].task_level;
+ level_table[l]->task_activate(l,p);
+ event_need_reschedule();
+}
+
+TASK Jlobby()
+{
+ kern_printf("(*)");
+ return 0;
+}
+
+TASK Jh()
+{
+ PID l;
+ HARD_TASK_MODEL m;
+ SRP_RES_MODEL r;
+
+ kern_printf("JH: creating Jy before locking m3\n");
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m,30000);
+ hard_task_def_wcet(m,1000);
+ SRP_res_default_model(r,4);
+ l = task_create("Jlobby",Jlobby,&m,&r);
+ task_activate(l);
+
+ mutex_lock(&m3);
+ kern_printf("JH: locked m3, locking m1\n");
+ mutex_lock(&m1);
+ kern_printf("JH: locked m1, unlocking m1\n");
+ mutex_unlock(&m1);
+ kern_printf("JH: unlocked m1, unlocking m3\n");
+ mutex_unlock(&m3);
+ kern_printf("JH: unlocked m3, end task\n");
+ return 0;
+}
+
+
+TASK Jm()
+{
+ kern_printf("JM: before locking m3\n");
+ mutex_lock(&m3);
+ kern_printf("JM: locked m3, locking m2\n");
+ mutex_lock(&m2);
+ kern_printf("JM: locked m2, unlocking m2\n");
+ mutex_unlock(&m2);
+ kern_printf("JM: unlocked m2, unlocking m3\n");
+ mutex_unlock(&m3);
+ kern_printf("JM: unlocked m3, locking m1\n");
+ mutex_lock(&m1);
+ kern_printf("JM: locked m1, unlocking m1\n");
+ mutex_unlock(&m1);
+ kern_printf("JM: unlocked m1, end task\n");
+ return 0;
+}
+
+
+TASK Jl()
+{
+// struct timespec t;
+ kern_printf("JL: before locking m2\n");
+ mutex_lock(&m2);
+ kern_printf("JL: locked m2, waiting to t=1 sec\n");
+
+ while (gt() < 1000000);
+
+ kern_printf("JL: t = 1 sec reached, locking m1\n");
+ mutex_lock(&m1);
+ kern_printf("JL: locked m1, waiting to t=2 sec\n");
+
+ while (gt() < 2000000);
+
+ kern_printf("JL: t = 2 sec reached, unlocking m1\n");
+ mutex_unlock(&m1);
+ kern_printf("JL: unlocked m1, unlocking m2\n");
+
+ mutex_unlock(&m2);
+
+ kern_printf("JL: unlocked m2, locking m3\n");
+ mutex_lock(&m3);
+ kern_printf("JL: locked m3, unlocking m3\n");
+ mutex_unlock(&m3);
+ kern_printf("JL: unlocked m3, end task\n");
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+
+ HARD_TASK_MODEL m;
+ PID p0,p1,p2;
+
+ SRP_mutexattr_t a;
+ SRP_RES_MODEL r;
+
+ PI_mutexattr_t a2;
+
+ KEY_EVT emerg;
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ /* ---------------------------------------------------------------------
+ Mutex creation
+ --------------------------------------------------------------------- */
+
+ PI_mutexattr_default(a2);
+ SRP_mutexattr_default(a);
+ mutex_init(&m1,&a);
+ mutex_init(&m2,&a);
+ mutex_init(&m3,&a);
+
+
+ /* ---------------------------------------------------------------------
+ Task creation
+ --------------------------------------------------------------------- */
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 1000000);
+ hard_task_def_wcet(m, 80000);
+ SRP_res_default_model(r, 3);
+ p0 = task_createn("JH", Jh, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1), NULL);
+ if (p0 == NIL)
+ { kern_printf("Can't create JH task...\n"); return 1; }
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 2100000);
+ hard_task_def_wcet(m, 80000);
+ SRP_res_default_model(r, 2);
+ p1 = task_createn("JM", Jm, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1),
+ SRP_usemutex(&m2), NULL);
+ if (p1 == NIL)
+ { kern_printf("Can't create JM task...\n"); return 1; }
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m, 10000000);
+ hard_task_def_wcet(m, 3000000);
+ SRP_res_default_model(r, 1);
+ p2 = task_createn("JL", Jl, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1),
+ SRP_usemutex(&m2), NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create JL task...\n"); return 1; }
+
+// sys_abort(1);
+ /* ---------------------------------------------------------------------
+ Event post
+ --------------------------------------------------------------------- */
+
+ t.tv_sec = 0;
+ t.tv_nsec = 500000000;
+// t.tv_nsec = 30000000;
+ kern_event_post(&t,startJ,(void *)p1);
+
+ t.tv_sec = 1;
+ kern_event_post(&t,startJ,(void *)p0);
+
+ task_activate(p2);
+
+ kern_printf("END main\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testk.c
===================================================================
--- branches/pj/oldexamples/kernel/testk.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testk.c (revision 1085)
@@ -0,0 +1,226 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testk.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 20 (K):
+
+ This test verify the correctness of the NOP module. It works with the PI
+ module, too.
+
+ The test uses one mutex
+
+ the main task (NRT) creates three tasks.
+
+ J1 with PC priority 0
+ starts at t=0.5 sec and lock m0
+
+ J2 with PC priority 1
+ starts at t=1 sec and doesn't lock any mutex
+
+ J3 with PC priority 2
+ it starts and locks m0
+ at t=2 sec it unlocks m1
+
+
+ The example is similar to the scheduling diagram shown at p. 188 of the
+ book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/keyb.h"
+
+#include <modules//srp.h>
+
+mutex_t m0;
+
+
+TIME gt(void)
+{
+ TIME t;
+ kern_cli();
+ t = ll_gettime(TIME_EXACT,NULL);
+ kern_sti();
+ return t;
+}
+
+void startJ(void *a)
+{
+// task_activate((PID)a);
+ PID p = (PID) a;
+ LEVEL l;
+
+ kern_printf("startJ: %d\n",p);
+
+ l = proc_table[p].task_level;
+ level_table[l]->task_activate(l,p);
+ event_need_reschedule();
+}
+
+TASK j1()
+{
+ kern_printf("J1: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J1: locked m0\n");
+ mutex_unlock(&m0);
+ kern_printf("J1: unlocked m0, end task\n");
+ return 0;
+}
+
+
+TASK j2()
+{
+ kern_printf("J2: waiting t=1.5 sec\n");
+
+ while (gt() < 1500000);
+
+ kern_printf("J2: end task\n");
+ return 0;
+}
+
+
+TASK j3()
+{
+ kern_printf("J3: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J3: locked m0, waiting to t=2 sec\n");
+
+ while (gt() < 2000000);
+
+ kern_printf("J3: t = 1 sec reached, unlocking m0\n");
+ mutex_unlock(&m0);
+ kern_printf("J3: unlocked m0, end task\n");
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+
+ HARD_TASK_MODEL m;
+ PID p0,p1,p2;
+
+ PC_mutexattr_t a;
+ PI_mutexattr_t a2;
+ NOP_mutexattr_t a3;
+ SRP_mutexattr_t a4;
+ NPP_mutexattr_t a5;
+
+ PC_RES_MODEL r;
+ SRP_RES_MODEL srp;
+
+ KEY_EVT emerg;
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ /* ---------------------------------------------------------------------
+ Mutex creation
+ --------------------------------------------------------------------- */
+
+ PC_mutexattr_default(a,0);
+ PI_mutexattr_default(a2);
+ NOP_mutexattr_default(a3);
+ SRP_mutexattr_default(a4);
+ NPP_mutexattr_default(a5);
+ mutex_init(&m0,&a4);
+
+ /* ---------------------------------------------------------------------
+ Task creation
+ --------------------------------------------------------------------- */
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,20000);
+ hard_task_def_mit(m,10000000);
+ PC_res_default_model(r,0);
+ SRP_res_default_model(srp,3);
+// p0 = task_createn("J1", j1, &m, &r, &srp, NULL);
+ p0 = task_createn("J1", j1, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL);
+ if (p0 == NIL)
+ { kern_printf("Can't create J1 task...\n"); return 1; }
+
+ hard_task_def_wcet(m,1600000);
+ hard_task_def_mit(m,21000000);
+ PC_res_default_model(r,1);
+ SRP_res_default_model(srp,2);
+ p1 = task_createn("J2", j2, (TASK_MODEL *)&m, &r, &srp, NULL);
+ if (p1 == NIL)
+ { kern_printf("Can't create J2 task...\n"); return 1; }
+
+ hard_task_def_wcet(m,3000000);
+ hard_task_def_mit(m,100000000);
+ PC_res_default_model(r,2);
+ SRP_res_default_model(srp,1);
+// p2 = task_createn("J3", j3, &m, &r, &srp, NULL);
+ p2 = task_createn("J3", j3, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create J3 task...\n"); return 1; }
+
+
+ /* ---------------------------------------------------------------------
+ Event post
+ --------------------------------------------------------------------- */
+
+ t.tv_sec = 0;
+ t.tv_nsec = 500000000;
+// t.tv_nsec = 30000000;
+ kern_event_post(&t,startJ,(void *)p0);
+
+ t.tv_sec = 1;
+ kern_event_post(&t,startJ,(void *)p1);
+
+ task_activate(p2);
+
+ kern_printf("END main\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testl.c
===================================================================
--- branches/pj/oldexamples/kernel/testl.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testl.c (revision 1085)
@@ -0,0 +1,487 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testl.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 21 (l):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 17 (h), and the JobControl Task uses an
+ SOFT_TASK_MODEL served by a polling server
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "drivers/keyb.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 6200
+#define APER_WCET 18400
+#define JET_WCET 10000
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+mutex_t m1;
+
+
+#define PIMUTEX
+//#define NPPMUTEX
+//#define NOPMUTEX
+
+#define LONGSC
+
+#ifdef LONGSC
+#define SOFT_MET 3000 /* 12000 */
+#define CLOCK_WCET 200 /* 300*/
+#define ASTER_WCET 200 /* 300*/
+#else
+#define SOFT_MET 80000 /* 4500 */
+#define CLOCK_WCET 2000 /* 200*/
+#define ASTER_WCET 2000 /* 200*/
+#endif
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ #ifdef LONGSC
+ mutex_unlock(&m1);
+ #endif
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = c;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = 1;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+// HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+/* periodic_task_default_model(m,0,PER_WCET);
+ periodic_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ periodic_task_def_period(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+*/
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+
+ x = 128; //64;
+
+ while (1) {
+/* {
+ PID p;
+ int x;
+ p = level_table[0]->level_scheduler(0);
+ printf_xy(1,8,WHITE," ");
+
+ x = 0;
+ do {
+ printf_xy(3*x+1,8,WHITE,"%3d",p);
+ p = proc_table[p].next;
+ x++;
+ } while (p != NIL);
+ }
+*/
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ mutex_unlock(&m1);
+ }
+ else {
+ num_aster++;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ mutex_unlock(&m1);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
+
+ mutex_unlock(&m1);
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
+ mutex_unlock(&m1);
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ mutex_lock(&m1);
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ mutex_unlock(&m1);
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
+ (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
+ (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ mutex_lock(&m1);
+ if (proc_table[p].task_level == 2)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]);
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+// NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+// int i;
+ struct timespec fineprg;
+
+ #ifdef PIMUTEX
+ PI_mutexattr_t a;
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_t a;
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_t a;
+ #endif
+
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m,100000);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+// nrt_task_default_model(m_nrt);
+// nrt_task_def_group(m_nrt,1);
+// nrt_task_def_ctrl_jet(m_nrt);
+
+
+ soft_task_default_model(m_aper);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_period(m_soft,100000);
+ soft_task_def_met(m_soft,JET_WCET);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+/*
+ aperiodic_task_default_model(m_aper,APER_WCET);
+ aperiodic_task_def_ctrl_jet(m_aper);
+ aperiodic_task_def_system(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ aperiodic_task_def_level(m_aper, i/4 + 2);
+ aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+*/
+ task_nopreempt();
+
+ #ifdef PIMUTEX
+ PI_mutexattr_default(a);
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_default(a);
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_default(a);
+ #endif
+
+ mutex_init(&m1, &a);
+
+ fineprg.tv_sec = 1800;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/testm.c
===================================================================
--- branches/pj/oldexamples/kernel/testm.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testm.c (revision 1085)
@@ -0,0 +1,318 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testm.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 22 (M):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 10(A), and test the PS with RM.
+
+ The JetControl is served by a dedicated Polling Server, too.
+
+ There are APER_MAX tasks sleeping, and when an asteroide task finish
+ the current activation, it activate also an aperiodic task chosen
+ randomly (if the task chosen is already active, the task_activate do
+ nothing!)
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules//edf.h"
+#include "drivers/keyb.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define APER_MAX 8
+
+#define PER_WCET 7800
+#define APER_WCET 14000
+#define CLOCK_WCET 200
+#define ASTER_WCET 200
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ s[0] = c;
+ puts_xy(i,y,rand()%15+1,s);
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ int r;
+ int x; // adaptive bandwidth...
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+
+ x = 64;
+
+ srand(7);
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ hard_task_def_arg(m,(void *)((rand() % 7)+1));
+ hard_task_def_mit(m, (x+r)*1000);
+ p = task_create("aaa",asteroide,&m,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+ NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ int i;
+ struct timespec fineprg;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt,1);
+ nrt_task_def_ctrl_jet(m_nrt);
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_level(m_aper, 1);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_aperiodic(m_aper);
+ p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ soft_task_def_wcet(m_aper,APER_WCET);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ soft_task_def_level(m_aper, i/4 + 3);
+ soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+
+ fineprg.tv_sec = 1000;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
+
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/testn.c
===================================================================
--- branches/pj/oldexamples/kernel/testn.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testn.c (revision 1085)
@@ -0,0 +1,211 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testn.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 23 (N):
+
+ This is the mousfind.c Hartik's example.
+
+ It find the mouse...
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <kernel/kern.h>
+#include <drivers/mouse.h>
+#include <drivers/keyb.h>
+
+/* don't include this into real applications*/
+#include <../drivers/char/_mouse.h>
+
+#define cons_columns 80
+#define cons_rows 25
+
+int done;
+
+void my_ctrlC_function(KEY_EVT *k)
+{
+ CRSR_STD();
+ done=1;
+ //sys_status(0xffff);
+ sys_end();
+ l1_exit(0);
+}
+
+//extern int tindex;
+//extern DWORD tdata[];
+//int first=1;
+
+
+void my_mouse_hook(MOUSE_EVT *m)
+{
+ static int buttons=-1;
+ if (buttons!=m->buttons) {
+ buttons=m->buttons;
+ //mouse_off();
+ if (isLeftButton(*m)) puts_xy(9,22,RED,"active");
+ else puts_xy(9,22,RED," ");
+ if (isCentralButton(*m)) puts_xy(9,23,RED,"active");
+ else puts_xy(9,23,RED," ");
+ if (isRightButton(*m)) puts_xy(9,24,RED,"active");
+ else puts_xy(9,24,RED," ");
+ //mouse_on();
+ }
+
+
+ /*
+ if (tindex>20&&first) {
+ int i;
+ cprintf("\nSTART\n");
+ for (i=0;i<tindex;i++) {
+ cprintf("%i\n",(int)tdata[i]);
+ }
+ for (i=1;i<tindex;i++) {
+ cprintf("%i ",(int)(tdata[i]-tdata[i-1]));
+ }
+ first=0;
+ }
+ */
+
+}
+
+int main(int argc,char *argv[])
+{
+// KEYB_PARMS keyb =BASE_KEYB;
+ MOUSE_PARMS mouse=BASE_MOUSE;
+ int ch,running,nm;
+ int sens=5;
+
+ /* keyboard initialization */
+// keyb_def_ctrlC(keyb,my_ctrlC_function);
+// keyb_init(&keyb);
+
+ /* screen */
+ clear();
+ nm=0;
+ while (*vmouse[nm].name!='\0') {
+ cprintf("%c %s:\t %s\n",(char)('a'+nm),vmouse[nm].name,vmouse[nm].desc);
+ nm++;
+ }
+ cprintf("\n[a-%c]\t select a mouse server\n",(char)(nm+'a'-1));
+ cprintf("[z]\t decrement mouse threshold\n");
+ cprintf("[x]\t incremnet mouse threshold\n");
+ cprintf("[ctrl-c]\t exit\n");
+ place(0,20);
+ cputs("mouse server:\n");
+ cputs("threshold:\n");
+ cputs("left :\n");
+ cputs("central:\n");
+ cputs("right :");
+ CRSR_OFF();
+
+ /* main loop */
+ running=done=0;
+ while (!done) {
+ ch=keyb_getch(TRUE);
+ switch(ch) {
+
+ /* decrement threshold */
+
+ case 'z':
+ sens--;
+ if (sens<2) sens=2;
+ mouse_threshold(sens);
+ /* threshold */
+ place(11,21);
+ cprintf("%i ",sens);
+ break;
+
+ /* increment threshold */
+
+ case 'x':
+ sens++;
+ if (sens>100) sens=100;
+ mouse_threshold(sens);
+ /* threshold */
+ place(11,21);
+ cprintf("%i ",sens);
+ break;
+
+ /* change mouse protocol */
+
+ default:
+ if (ch>='a'&&ch<='a'+nm-1) {
+ /* check if a mouse server is running... */
+ if (running) {
+ /* disable autocursor */
+ mouse_txtcursor(DISABLE);
+ /* destroy actual mouse server */
+ mouse_end();
+ }
+ /* mouse server name */
+ puts_xy(14,20,GREEN," ");
+ puts_xy(14,20,GREEN,vmouse[ch-'a'].name);
+ /* threshold */
+ place(11,21);
+ cprintf("%i ",sens);
+ /* don't use this method to change a mouse protocol */
+ /* use mouse_def_???? macros instead */
+ mouse.type=ch-'a';
+ /* start a new server */
+ running=(mouse_init(&mouse)==0?1:0);
+ /* if running ...*/
+ if (running) {
+ /* set mouse limit */
+ mouse_limit(0,0,cons_columns-1,cons_rows-1);
+ /* enable autocursor */
+ mouse_txtcursor(ENABLE|AUTOOFF);
+ /* hook my function */
+ mouse_hook(my_mouse_hook);
+ /* show mouse cursor */
+ mouse_on();
+ }
+ }
+ break;
+
+ }
+ }
+
+ CRSR_STD();
+ sys_end();
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testo.c
===================================================================
--- branches/pj/oldexamples/kernel/testo.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testo.c (revision 1085)
@@ -0,0 +1,99 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testo.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test 24 (O):
+
+ This is the pcitest Hartik's example.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+#include <drivers/llpci.h>
+#include <drivers/pci.h>
+
+void scan()
+{
+// int i, ndev;
+// WORD Class;
+// struct pci_regs *r;
+ BYTE bus, dev;
+
+ /* Scan the devices connected to the PCI bus */
+ if (pci_init() == 1) {
+ clear();
+ pci_show();
+ bus = 0; dev = 0;
+ if (pcibios_find_device(0x8086, 0x7000, 0, &bus, &dev) == NULL)
+ cprintf("Not found... %d %d\n", bus, dev);
+ else cprintf("Found: %d \t %d\n", bus, dev);
+
+ if (pcibios_find_class(0x300, 0, &bus, &dev) == NULL)
+ cprintf("Not found... %d %d\n", bus, dev);
+ else cprintf("Found: %d \t %d\n", bus, dev);
+ } else cprintf("PCI not found!!!\n");
+}
+
+void endfun(KEY_EVT *k)
+{
+ sys_abort(60000);
+}
+
+int main (int argc, char *argv[])
+{
+ KEY_EVT k;
+
+ k.flag = CNTR_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,endfun);
+
+ scan();
+ while(1);
+
+ sys_end();
+ return -1;
+}
Index: branches/pj/oldexamples/kernel/testp.c
===================================================================
--- branches/pj/oldexamples/kernel/testp.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testp.c (revision 1085)
@@ -0,0 +1,227 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testp.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test 25 (P):
+
+ This is the talkdx.c Hartik's example.
+
+ File: Talk.C
+ Revision: 1.00
+ Author: Luca Abeni
+
+
+ Simple Netlib demo: nothing of seriously real-time, only another Unix
+ Talk clone.
+ Read it to see how the UDP/IP layers of the networ library work.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <kernel/kern.h>
+//#include <mem.h>
+//#include <stdlib.h>
+#include <string.h>
+//#include <cons.h>
+#include <drivers/crtwin.h>
+#include <drivers/keyb.h>
+
+#include <drivers/udpip.h>
+
+
+WIN dbg;
+BYTE esc = FALSE;
+
+char talk_myipaddr[20];
+char talk_toipaddr[20];
+
+/*
+ This non real-time task reads UDP packets from the network and writes
+ them in a window
+*/
+TASK scrittore(void)
+{
+ char str[2000];
+ UDP_ADDR from, local;
+ WIN displ;
+ int s,n;
+
+ /* Connect on the local port #100 */
+ local.s_port = 100;
+ s = udp_bind(&local, NULL);
+
+ /* Open the window */
+ win_init(&displ,0,0,79,6);
+ win_frame(&displ,BLACK,WHITE,"Remote",2);
+
+ while (1) {
+ /* Clear the buffer for receiving the packet...*/
+ memset(str, 0, 1999);
+ /*...and receive the packet (block until a packet arrives */
+ n = udp_recvfrom(s, str, &from);
+ win_puts(&displ, str);
+ }
+}
+
+/*
+ This non real-time task reads strings from the keyoard and sends them
+ to the remote host
+*/
+TASK write(void)
+{
+ WIN wr;
+ UDP_ADDR to,local;
+ char str[80];
+ int s;
+ IP_ADDR bindlist[5];
+
+ /* Create a socket for transitting */
+ ip_str2addr(talk_myipaddr,&(local.s_addr));
+ local.s_port = 101;
+
+ /*
+ If we want the address of the remote host in the ARP table before
+ begginning the transmission (to eliminate a possible source of
+ unpredictability), we can use the bindlist, otherwise we set the
+ second parameter of udp_bind to NULL
+ */
+ ip_str2addr(talk_toipaddr,&(bindlist[0]));
+ memset(&(bindlist[1]), 0, sizeof(IP_ADDR));
+ s = udp_bind(&local, /*bindlist*/NULL);
+
+ win_init(&wr,0,7,79,6);
+ win_frame(&wr,BLACK,WHITE,"Local",2);
+ ip_str2addr(talk_toipaddr,&(to.s_addr));
+ to.s_port = 100;
+ sprintf(str,"Local IP address %d.%d.%d.%d\n", local.s_addr.ad[0],
+ local.s_addr.ad[1], local.s_addr.ad[2],
+ local.s_addr.ad[3]);
+ win_puts(&dbg,str);
+ sprintf(str,"Talk to %d.%d.%d.%d ",to.s_addr.ad[0],to.s_addr.ad[1],
+ to.s_addr.ad[2],to.s_addr.ad[3]);
+ win_puts(&dbg,str);
+ while (1) {
+ /* Get the string...*/
+ win_gets(&wr,str,78);
+ strcat(str,"\n");
+ /*...and send it!!! */
+ udp_sendto(s,str,strlen(str)+2,&to);
+ }
+}
+
+/* This function is called when the user presses CTRL-C (stops the systems) */
+void esci(KEY_EVT *k)
+{
+ esc = TRUE;
+ cprintf("Ctrl-Brk pressed!\n");
+ //sys_status(0xFFFF);
+ sys_abort(500);
+ //exit(1);
+}
+
+int main(void)
+{
+ KEY_EVT k;
+
+ struct net_model m = net_base;
+
+ NRT_TASK_MODEL m_nrt;
+
+ k.flag = CNTL_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,esci);
+ k.flag = CNTR_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,esci);
+
+ clear();
+ cprintf(" Hartik Talk! Ver. 1.00\n");
+// strcpy(talk_myipaddr, "193.205.82.46");
+// strcpy(talk_toipaddr, "193.205.82.44");
+
+ strcpy(talk_myipaddr, "193.205.82.44");
+ strcpy(talk_toipaddr, "193.205.82.46");
+
+ /* We want a task for TX mutual exclusion */
+ net_setmode(m, TXTASK);
+ /* We use UDP/IP stack */
+ net_setudpip(m, talk_myipaddr);
+ /* OK: let's start the NetLib! */
+ if (net_init(&m) == 1) {
+ cprintf("Net Init OK...\n");
+ } else {
+ cprintf("Net Init Failed...\n");
+ sys_abort(300);
+ }
+
+
+//dump_irq();
+
+ cprintf("\n\n\n\tPress ENTER\n");
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+ esc = FALSE;
+ clear();
+ win_init(&dbg,0,20,60,3);
+ win_frame(&dbg,BLACK,WHITE,"Debug",2);
+
+ /* Start the sender and receiver tasks...*/
+ //task_nopreempt();
+ nrt_task_default_model(m_nrt);
+ task_activate(task_create("aaa",scrittore,&m_nrt,NULL));
+ task_activate(task_create("bbb",write,&m_nrt,NULL));
+
+ //clear();
+ //task_preempt();
+
+ /*...and wait!!! */
+ while (!esc) {
+ }
+ sys_end();
+ //clear();
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testq.c
===================================================================
--- branches/pj/oldexamples/kernel/testq.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testq.c (revision 1085)
@@ -0,0 +1,229 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testq.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 26 (Q):
+
+ This test verify the correctness of the task_join primitive.
+
+ There are 4 taks, J1, J2, J3, are created as joinable, J4 as detached
+ (the standard with hartik...)
+
+ The main task:
+ Creates J1 and J2, locks m1 (a PI mitex), creates C3.
+ at t=0.8 sec it calls a task_join on J3 (that returns EDEADLK),
+ it unlocks m1, then it makes task_join on J3 another time.
+ Next it creates J4 as detached and finally it does a task_join on J4
+ (that returns EINVAL).
+
+ J1:
+ at t=0.2 sec it calls task_join on J2, the it ends.
+
+ J2:
+ it simply waits t=0.4 sec and it ends.
+
+ J3:
+ First, it calls task_join on J1.
+ Then, at t=0.6 sec it locks m1, then unlocks it
+
+ J4:
+ it simply waits t=1 sec and it ends.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/keyb.h"
+
+#include <modules//srp.h>
+
+
+PID j0, j1, j2, j3, j4;
+mutex_t m1;
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+TASK J1()
+{
+ int err;
+ void *ret;
+
+ kern_printf("J1: started, waiting 0.2 sec\n");
+
+ while (sys_gettime(NULL) < 200000);
+
+ kern_printf("J1: 0.2 sec reached, joining J2\n");
+
+ err = task_join(j2, &ret);
+
+ kern_printf("J1: join J2 returns %d error %d, exiting\n",
+ (int)ret,err);
+ return (void *)11;
+}
+
+TASK J2()
+{
+ kern_printf("J2: started, waiting 0.4 sec\n");
+
+ while (sys_gettime(NULL) < 400000);
+
+ kern_printf("J2: 0.4 sec reached, exiting\n");
+
+ return (void *)22;
+}
+
+TASK J3()
+{
+ int err;
+ void *ret;
+
+ kern_printf("J3: started, joining J1\n");
+
+ err = task_join(j1, &ret);
+
+ kern_printf("J3: join J1 returns %d error %d, waiting 0.6sec\n", (int)ret, err);
+
+ while (sys_gettime(NULL) < 600000);
+
+ kern_printf("J1: 0.6 sec reached, locking m1\n");
+
+ mutex_lock(&m1);
+
+ kern_printf("J3: locked m1, unlocking m1\n");
+
+ mutex_unlock(&m1);
+
+ kern_printf("J3: unlocked m1, exiting\n");
+
+ return (void *)33;
+}
+
+TASK J4()
+{
+ kern_printf("J4: started, waiting 1 sec\n");
+
+ while (sys_gettime(NULL) < 1000000);
+
+ kern_printf("J4: 1 sec reached, exiting\n");
+
+ return (void *)44;
+}
+
+int main(int argc, char **argv)
+{
+ NRT_TASK_MODEL m;
+
+ PI_mutexattr_t a;
+
+ KEY_EVT emerg;
+
+ int err;
+ void *ret;
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ j0 = exec_shadow;
+ nrt_task_default_model(m);
+ nrt_task_def_joinable(m);
+
+ /* ---------------------------------------------------------------------
+ Mutex creation
+ --------------------------------------------------------------------- */
+
+ PI_mutexattr_default(a);
+ mutex_init(&m1,&a);
+
+
+ /* ---------------------------------------------------------------------
+ Let's go !!!!
+ --------------------------------------------------------------------- */
+
+ kern_printf("main: creating J1,J2,J3, locking m1\n");
+
+ j1 = task_create("J1", J1, &m, NULL);
+ if (j1 == NIL) { kern_printf("Can't create J1 task...\n"); return 1; }
+ task_activate(j1);
+
+ j2 = task_create("J2", J2, &m, NULL);
+ if (j2 == NIL) { kern_printf("Can't create J2 task...\n"); return 1; }
+ task_activate(j2);
+
+ mutex_lock(&m1);
+
+ j3 = task_create("J3", J3, &m, NULL);
+ if (j3 == NIL) { kern_printf("Can't create J3 task...\n"); return 1; }
+ task_activate(j3);
+
+ kern_printf("main: waiting t=0.8 sec\n");
+
+ while (sys_gettime(NULL) < 800000);
+
+ err = task_join(j3, NULL);
+
+ kern_printf("main: join J3 error %d, unlocking m1\n",err);
+
+ mutex_unlock(&m1);
+
+ err = task_join(j3, &ret);
+
+ kern_printf("main: join J3 returns %d error %d, unlocked m1, creating J4\n",
+ (int)ret,err);
+
+ nrt_task_def_unjoinable(m);
+ j4 = task_create("J4", J4, &m, NULL);
+ if (j4 == NIL) { kern_printf("Can't create J4 task...\n"); return 1; }
+
+ task_activate(j4);
+
+ err = task_join(j4,&ret);
+
+ kern_printf("main: join J4 returns %d error %d, exiting\n", (int)ret, err);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test1.c
===================================================================
--- branches/pj/oldexamples/kernel/test1.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test1.c (revision 1085)
@@ -0,0 +1,167 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test1.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 1:
+
+ this test is a simple main() function with other 2 task
+
+ This test has to be compiled with init1.c, that introduce 2 RR levels
+ with a timeslice of 300us (!)
+
+ This test can be useful to test functions like
+
+ task_nopreempt
+ task_preempt
+ task_create
+ task_activate
+ task_delay
+ group_activate
+ normal task termination (task_abort)
+ normal system termination (sys_end)
+ standard atexit functions (the keyboard...)
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+// for min
+#include "ll/stdlib.h"
+
+#include "ll/stdio.h"
+
+
+#if !defined(__TEST1__)
+ THE TEST REQUIRE THE DEFINITION __TEST1__ IN CONFIG.C
+#endif
+
+struct timespec s_stime[10000];
+struct timespec s_send[10000];
+TIME s_curr[10000];
+PID s_PID[10000];
+int useds=0;
+int testactive=1;
+
+
+TASK pippo()
+{
+// int i;
+ struct timespec t;
+ int last = 0;
+
+ do {
+//kern_printf("!");
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if ((t.tv_nsec/1000000) != last) { //ogni 7000
+// kern_printf("Û%dÛ",t);
+ last = t.tv_nsec/1000000;
+// task_delay(3000000);
+ }
+
+ } while (t.tv_nsec <= 20000000L);
+}
+
+TASK pippo2()
+{
+ struct timespec t;
+ do {
+// kern_printf("pippo2");
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ if (t.tv_nsec > 5000000 && t.tv_nsec <= 12000000) task_nopreempt();
+ if (t.tv_nsec > 12000000) task_preempt();
+
+ } while (t.tv_nsec <= 20000000L);
+}
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ int i;
+ NRT_TASK_MODEL m;
+ PID p2,p3;
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ p2 = task_createn("pippo", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo task...\n"); return 1; }
+
+ p3 = task_createn("pippo2", pippo2, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ group_activate(1);
+
+
+ kern_printf("DENTRO MAIN %d\n",ll_context_save());
+
+// testactive = 1;
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+// task_delay(14000);
+
+ } while (t.tv_nsec <= 40000000L);
+ testactive = 0;
+
+// sys_status(0xFFFF);
+// return 0;
+
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<min(useds,20); i++)
+ kern_printf("%6d: pid %6d stime %-9d reschedule %-9d avail %-9d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+// sys_end();
+
+ kern_printf("DENTRO MAIN %d\n",ll_context_save());
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test2.c
===================================================================
--- branches/pj/oldexamples/kernel/test2.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test2.c (revision 1085)
@@ -0,0 +1,161 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test2.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 2:
+ task_testcancel,
+ task_delay
+ task_setcancelstate
+
+ The task 2 disappear after time 10000 because we have reactivated
+ the cancelability and a testcancel is issued
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#if !defined(__TEST1__)
+ THE TEST REQUIRE THE DEFINITION __TEST1__ IN CONFIG.C
+#endif
+
+struct timespec s_stime[10000];
+struct timespec s_send[10000];
+TIME s_curr[10000];
+PID s_PID[10000];
+int useds=0;
+int testactive=1;
+
+
+TASK pippo()
+{
+ int i;
+ struct timespec t;
+// int last = 0;
+
+ task_setcancelstate(TASK_CANCEL_DISABLE,&i);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+// printf_xy(10,8,WHITE,"%9d s%9d n%9d",exec_shadow,t.tv_sec,t.tv_nsec);
+
+ if (t.tv_nsec > 10000000)
+ {
+ task_setcancelstate(TASK_CANCEL_ENABLE,&i);
+ }
+ if (t.tv_nsec > 5000000)
+ {
+// kern_printf("\n%d %dÄ", exec_shadow, proc_table[exec_shadow].control);
+ task_testcancel();
+ }
+ task_delay(1000);
+// kern_printf("Dopo Delay %d ",exec_shadow);
+
+ } while (t.tv_nsec <= 30000000L);
+}
+
+TASK pippo2()
+{
+ int i;
+ struct timespec t;
+// int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+// printf_xy(10,9,WHITE,"%d s%9d n%9d\n",exec_shadow,t.tv_sec,t.tv_nsec);
+// kern_printf("Û%dÛ",proc_table[exec_shadow].control);
+
+ if (t.tv_nsec > 15000000)
+ {
+// kern_printf("XXXXXXXXXX");
+ task_setcanceltype(TASK_CANCEL_ASYNCHRONOUS,&i);
+ }
+ task_delay(1000);
+
+ } while (t.tv_nsec <= 30000000L);
+}
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ int i;
+ NRT_TASK_MODEL m;
+ PID p2,p3;
+// int k=1;
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ p2 = task_create("pippo2", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ p3 = task_create("pippo3", pippo2, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create pippo3 task...\n"); return 1; }
+
+ group_activate(1);
+
+
+ task_kill(p2);
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ task_kill(p3);
+
+ } while (t.tv_nsec <= 20000000L);
+ testactive = 0;
+
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<useds; i++)
+ kern_printf("%6d: pid %-9d stime %-9d reschedule %-9d avail %-9d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testr.c
===================================================================
--- branches/pj/oldexamples/kernel/testr.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testr.c (revision 1085)
@@ -0,0 +1,231 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testr.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 27 (R):
+
+ This test verify the correctness of the condition variables.
+ (... it doesn't test all...)
+
+ The test uses 1 mutex
+
+ the main task (NRT) creates three tasks.
+
+ J0, J1, J3
+ starts, lock the mutex, and wait on a condition variable
+
+ J2
+ at t = 0.5 lock the mutex and call cond_signal
+ at t = 1 lock the mutex and call cond_signal
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "drivers/keyb.h"
+
+
+mutex_t m0;
+cond_t c0;
+
+int number = 0;
+
+PID p0,p1,p2,p3;
+
+TASK j0()
+{
+ kern_printf("J0: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J0: locked m0, waiting on c0, number =%d\n", number);
+ while (!number) {
+ cond_wait(&c0,&m0);
+ kern_printf("J0: number = %d, if >0 unlocking m0\n",number);
+ }
+ number--;
+ mutex_unlock(&m0);
+ kern_printf("J0: unlocked m0, end task\n");
+ return 0;
+}
+
+
+TASK j1()
+{
+ kern_printf("J1: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J1: locked m0, waiting on c0, number =%d\n", number);
+ while (!number) {
+ cond_wait(&c0,&m0);
+ kern_printf("J1: number = %d, if >0 unlocking m0\n",number);
+ }
+ number--;
+ mutex_unlock(&m0);
+ kern_printf("J1: unlocked m0, end task\n");
+ return 0;
+}
+
+
+TASK j2()
+{
+// struct timespec t;
+
+ kern_printf("J2: started, waiting t=0.5 sec\n");
+ while (sys_gettime(NULL) < 500000);
+
+ kern_printf("J2: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J2: locked m0, number++ (was %d), cond_signal\n", number);
+
+ number++;
+ cond_signal(&c0);
+// cond_broadcast(&c0);
+
+ kern_printf("J2: unlocking m0\n");
+ mutex_unlock(&m0);
+
+ kern_printf("J2: waiting t=1 sec\n");
+ while (sys_gettime(NULL) < 1000000);
+
+ kern_printf("J2: Killing J3\n");
+ task_kill(p3);
+ kern_printf("J2: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J2: locked m0, number++ (was %d), cond_signal\n", number);
+
+ number++;
+ cond_signal(&c0);
+// cond_broadcast(&c0);
+
+ kern_printf("J2: unlocking m0\n");
+ mutex_unlock(&m0);
+ kern_printf("J2: unlocked m0, end task\n");
+ return 0;
+}
+
+void cleanup_lock(void *arg)
+{
+ kern_printf("J3: KILL!!!\n");
+ mutex_unlock(&m0);
+ kern_printf("J3: unlocked m0 by the cleanup function\n");
+}
+
+TASK j3()
+{
+ kern_printf("J3: before locking m0\n");
+ mutex_lock(&m0);
+ kern_printf("J3: locked m0, waiting on c0, number =%d\n", number);
+ task_cleanup_push(cleanup_lock, (void *)&m0);
+ while (!number) {
+ cond_wait(&c0,&m0);
+ kern_printf("J3: number = %d, if >0 unlocking m0\n",number);
+ }
+ task_cleanup_pop(0);
+ // I hope this task never reach this point... it is killed by J2!!!
+ number--;
+ mutex_unlock(&m0);
+ kern_printf("J3: unlocked m0, end task\n");
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+
+int main(int argc, char **argv)
+{
+// struct timespec t;
+
+ NRT_TASK_MODEL m;
+
+ PI_mutexattr_t a;
+
+ KEY_EVT emerg;
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ /* ---------------------------------------------------------------------
+ Task creation
+ --------------------------------------------------------------------- */
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+ p0 = task_create("J0", j0, &m, NULL);
+ if (p0 == NIL)
+ { kern_printf("Can't create J0 task...\n"); return 1; }
+
+ p1 = task_create("J1", j1, &m, NULL);
+ if (p1 == NIL)
+ { kern_printf("Can't create J1 task...\n"); return 1; }
+
+ p2 = task_create("J2", j2, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create J2 task...\n"); return 1; }
+
+ p3 = task_create("J3", j3, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create J3 task...\n"); return 1; }
+
+ /* ---------------------------------------------------------------------
+ Mutex creation
+ --------------------------------------------------------------------- */
+
+ PI_mutexattr_default(a);
+ mutex_init(&m0,&a);
+
+ cond_init(&c0);
+
+ /* ---------------------------------------------------------------------
+ Event post
+ --------------------------------------------------------------------- */
+
+ group_activate(1);
+
+ kern_printf("END main\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/tests.c
===================================================================
--- branches/pj/oldexamples/kernel/tests.c (nonexistent)
+++ branches/pj/oldexamples/kernel/tests.c (revision 1085)
@@ -0,0 +1,79 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: tests.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ memtest.c:
+
+ try to allocate different regions of memory...
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+int main(int argc, char **argv)
+{
+ void *a;
+
+ kern_cli(); a = DOS_alloc(4500); kern_sti();
+ kern_printf("below 1 M: %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc_aligned(10000,MEMORY_UNDER_16M,10,0); kern_sti();
+ kern_printf("below 16M: %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc_aligned(10000,MEMORY_FROM_1M_TO_16M,2,0); kern_sti();
+ kern_printf(">1M <16M : %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc(10000); kern_sti();
+ kern_printf("normal : %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc_page(MEMORY_UNDER_1M); kern_sti();
+ kern_printf("page <1M : %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc_page(MEMORY_FROM_1M_TO_16M); kern_sti();
+ kern_printf("p>1<16M : %ld\n", (DWORD)a);
+
+ kern_cli(); a = kern_alloc_page(0); kern_sti();
+ kern_printf("page : %ld\n", (DWORD)a);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test3.c
===================================================================
--- branches/pj/oldexamples/kernel/test3.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test3.c (revision 1085)
@@ -0,0 +1,137 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test3.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 3:
+ task_cleanup_push
+ task_cleanup_pop
+
+ It may print many 0 and then only one 1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#if !defined(__TEST1__)
+ THE TEST REQUIRE THE DEFINITION __TEST1__ IN CONFIG.C
+#endif
+
+struct timespec s_stime[10000];
+struct timespec s_send[10000];
+TIME s_curr[10000];
+PID s_PID[10000];
+int useds=0;
+int testactive=1;
+
+
+void fun1(void *p)
+{
+ kern_printf("ÛÛ %d ÛÛ",(int)p);
+}
+
+
+TASK pippo()
+{
+ int i;
+ struct timespec t;
+ int last = 0;
+ task_cleanup_push(fun1,(void *)1);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (t.tv_nsec > 5000000)
+ {
+ task_testcancel();
+
+ task_cleanup_push(fun1,(void *)-1);
+ task_cleanup_push(fun1,(void *)0);
+ task_cleanup_pop(1);
+ task_cleanup_pop(0);
+ }
+ task_delay(1000);
+
+ } while (t.tv_nsec <= 30000000L);
+ task_cleanup_pop(1);
+}
+
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ NRT_TASK_MODEL m;
+ PID p2,p3;
+ int k=1;
+ int i;
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ p2 = task_create("pippo2", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ group_activate(1);
+
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (t.tv_nsec > 10000000) task_kill(p2);
+ } while (t.tv_nsec <= 20000000L);
+ testactive = 0;
+
+ return 0;
+
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<useds; i++)
+ kern_printf("%6d: pid %6d stime %6d reschedule %6d avail %6d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test4.c
===================================================================
--- branches/pj/oldexamples/kernel/test4.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test4.c (revision 1085)
@@ -0,0 +1,67 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test4.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+Test Number 4:
+
+ this test is a simple main() function
+
+ This test has to be compiled with init1.c, that introduce 2 RR levels
+ with a timeslice of 300us (!)
+
+ This test can be useful to test functions like
+
+ perror
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+int main(int argc, char **argv)
+{
+ errno = EUNVALID_KILL; kern_printf("code: %d ",errno); perror("EUNVALID_KILL");
+ errno = EINVAL; kern_printf("code: %d ",errno); perror("EINVAL");
+ errno = ENOMEDIUM; kern_printf("code: %d ",errno); perror("ENOMEDIUM");
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test5.c
===================================================================
--- branches/pj/oldexamples/kernel/test5.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test5.c (revision 1085)
@@ -0,0 +1,165 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test5.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 5:
+
+ this test is a simple main() function with one other task
+
+ This test has to be compiled with init1.c, that introduce 2 RR levels
+ with a timeslice of 300us (!)
+
+ This test can be useful to test functions like
+
+ sigemptyset
+ sigaddset
+ hartik_deliver_pending_signals
+ sys_end
+ task_sigmask
+ sigaction
+ sigqueue
+ task_signal
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+
+TASK pippo()
+{
+ struct timespec t;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ } while (t.tv_nsec <= 20000000L);
+ cli(); kern_printf("pippo"); sti();
+ return 0;
+}
+
+void catchit(int signo, siginfo_t *info, void *extra)
+{
+ kern_printf("\nÛ exec_shadow= %d signo=%d code=%d value=%d p=%d Û\n",
+ exec_shadow,
+ info->si_signo, info->si_code,
+ info->si_value.sival_int, info->si_task);
+}
+
+
+void catchit2(int signo)
+{
+ kern_printf("\nSignal %d: AAARRRRRRGGGGHHHH!!!!\n",signo);
+}
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ NRT_TASK_MODEL m;
+ PID p2;
+
+ sigset_t newmask;
+ sigset_t oldmask;
+ struct sigaction action;
+ union sigval sval;
+
+
+ /* Set the signal action */
+ action.sa_flags = SA_SIGINFO;
+ action.sa_sigaction = catchit;
+ action.sa_handler = 0;
+ action.sa_mask = 0;
+
+ if (sigaction(SIGUSR1, &action, NULL) == -1) {
+ perror("Errore");
+ return -1;
+ }
+
+ action.sa_flags = 0;
+ action.sa_handler = catchit2;
+// action.sa_sigaction = SIG_DFL;
+
+ if (sigaction(SIGILL, &action, NULL) == -1) {
+ perror("Errore");
+ return -1;
+ }
+
+ /* create another task */
+ nrt_task_default_model(m);
+ nrt_task_def_level(m,1);
+ nrt_task_def_group(m,1);
+
+ p2 = task_create("pippo", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo task...\n"); return 1; }
+
+ group_activate(1);
+
+ /* block the signal for the main task */
+ sigemptyset(&newmask);
+ sigaddset(&newmask,SIGUSR1);
+ task_sigmask(SIG_BLOCK, &newmask, &oldmask);
+
+ sval.sival_int = 123;
+ sigqueue(0,SIGUSR1,sval);
+ sval.sival_int = 999;
+ sigqueue(0,SIGUSR1,sval);
+
+ cli();kern_printf("\n()()()()\n"); sti();
+
+ task_signal(0 /* main */, SIGILL);
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ } while (t.tv_nsec <= 50000000L);
+
+ cli();kern_printf("\n()*********()\n"); sti();
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testu.c
===================================================================
--- branches/pj/oldexamples/kernel/testu.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testu.c (revision 1085)
@@ -0,0 +1,115 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testu.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number ?? (U):
+
+ this test is a simple main() function with one other task.
+
+ This test verify the correctness of the internal_sem functions.
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#include <kernel/int_sem.h>
+
+internal_sem_t s;
+
+TASK pippo(void *a)
+{
+ int i=0;
+ struct timespec t;
+// int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ if (i==0 && t.tv_sec == (int)a) {
+ i = 1;
+ kern_printf("before internal_sem_wait %d\n",(int)a);
+ internal_sem_wait(&s);
+ kern_printf("after internal_sem_wait %d\n",(int)a);
+ }
+
+ if (i==1 && t.tv_sec == 2+(int)a) {
+ i = 2;
+ kern_printf("before internal_sem_post %d\n",(int)a);
+ internal_sem_post(&s);
+ kern_printf("after internal_sem_post %d\n",(int)a);
+ return 0;
+ }
+
+
+ } while (1);
+}
+
+int main(int argc, char **argv)
+{
+// struct timespec t;
+// int i;
+ NRT_TASK_MODEL m;
+ PID p2,p3;
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ nrt_task_def_arg(m,(void *)1);
+ p2 = task_create("pippo1", pippo, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo1 task...\n"); return 1; }
+
+ nrt_task_def_arg(m,(void *)2);
+ p3 = task_create("pippo2", pippo, &m, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); return 1; }
+
+ internal_sem_init(&s,1);
+
+ group_activate(1);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test6.c
===================================================================
--- branches/pj/oldexamples/kernel/test6.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test6.c (revision 1085)
@@ -0,0 +1,465 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test6.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 6:
+
+ this is a part of the classic Hartik demo Aster.
+
+ It checks:
+ - EDF module
+ . periodic tasks
+ - an high number of task executing concurrently
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ Well, this is only a stupid demo which intend to show many
+ HARTIK+ capabilities; the application is structured in the followig
+ way: there is an ASTER task wich randomly creates some ASTEROID tasks
+ which are displayed into the first window; each task is HARD/PERIODIC
+ and auto-kills itself when it reaches the window end!
+ An other couple of tasks, TITLE & PUT give an example of port
+ communication facility; the server task creates the port, the client
+ task connect to it and uses the server to accomplish some stuff.
+ Port can be declared READ/WRITE and can model ONE-TO-ONE communication
+ or MANY-TO-ONE communication.
+ Finally a second couple of tasks realizes a communiation through CABs;
+ each time a key is pressed, the ascii code is posted into the CAB by the
+ CCC task while the second task, WRITE, displays it on the screen and
+ perform other silly actions.
+ Finally a CLOCK task is implemented to test system clock.
+ Please note that usually the HARTIK+ application is made up of a task
+ group which interacts among them, while the main() function, which
+ became a task itself when the kernel is activated, is suspended until
+ the system is ready to terminate; the MAIN task can also be used to make
+ other background activities, but it should not be killed; when the
+ application terminates, the control is passed to MAIN which kills
+ everybody, shut down the system and can handle other operations using
+ the services available with the previou operating system (I.E. the DOS).
+ If you need to manage sudden abort/exception you should install your own
+ exception handler and raise it through the exc_raise() primitive to
+ make the system abort safely!
+ Remember that the exit functions posted through sys_atexit() will be
+ executed in both cases, to allow clean system shutdown.
+*/
+
+//#include <string.h>
+//#include <stdlib.h>
+
+//#include "hartik.h"
+
+//#define __VPAGING__
+/* #define __TRACE__ */
+
+//#ifdef __TRACE__
+//#include "sys\log.h"
+//#endif
+
+//#include "keyb.h"
+//#include "cons.h"
+//#include "crtwin.h"
+
+#include "kernel/kern.h"
+
+
+int num_aster = 0;
+#define ASTER_LIM 67
+#define ASTER_MAX 90
+
+//CAB cc;
+//BYTE esc = FALSE;
+
+TASK asteroide(void)
+{
+ int i = 1;
+ int y = rand() % 20 + 1;
+ while (i < ASTER_LIM) {
+ puts_xy(i,y,WHITE,"*");
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ num_aster--;
+ return 0;
+}
+
+DWORD taskCreated = 0;
+
+TASK aster(void)
+{
+ PID p;
+
+// MODEL m = BASE_MODEL;
+ HARD_TASK_MODEL m;
+ int r;
+// WIN w;
+
+// win_init(&w,0,0,ASTER_LIM,8);
+// win_frame(&w,BLACK,WHITE,"Asteroids",2);
+
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,500);
+
+ srand(7);
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 50) - 25;
+
+ hard_task_def_arg(m,(void *)((rand() % 7)+1));
+ hard_task_def_mit(m, (50+r)*1000);
+ p = task_create("aaa",asteroide,&m,NULL);
+ taskCreated++;
+ task_activate(p);
+ num_aster++;
+ }
+
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ //WIN w;
+ int s = 0, m = 0;
+
+ //win_init(&w,68,0,11,2);
+ //win_frame(&w,BLACK,WHITE,"Clk",1);
+
+ while(1) {
+ printf_xy(70,1,WHITE,"%2d : %2d",m,s);
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(70,1,WHITE,"%2d : %2d",m,s);
+ task_endcycle();
+ }
+}
+
+/*
+TASK title()
+{
+ PORT t;
+ WIN w;
+ int i,pos = 77;
+ char msg[85],tmp[85],ss[2];
+ BYTE c;
+
+ win_init(&w,0,9,79,2);
+ win_frame(&w,BLACK,WHITE,"Title",2);
+
+ for (i=0; i < 77; i++) msg[i] = ' ';
+ msg[77] = 0;
+
+ t = port_connect("title",1,STREAM,READ);
+
+ while (1) {
+ port_receive(t,&c,BLOCK);
+ ss[0] = c;
+ ss[1] = 0;
+ strcat(msg,ss);
+ puts_xy(1,10,WHITE,msg);
+ pos++;
+ if (pos > 77) {
+ strcpy(tmp,&(msg[1]));
+ tmp[pos-1] = 0;
+ pos -= 1;
+ strcpy(msg,tmp);
+ }
+ task_endcycle();
+ }
+}
+
+#define STR "..................... Hartik+ ....................."\
+ " Guarantees hard tasks "\
+ " Includes soft periodic tasks "\
+ "TB server for decrementing the aperiodic response time "\
+ "SRP for both hard & soft aperiodic tasks "\
+ "Portability toward other compilers/system "\
+ "Support for different C compiler: Watcom C 16 bit & 32 bit"\
+ " -- GNU C (32 bit) -- Borland C (16 bit) -- MS C (16 bit)"\
+ " "\
+ "Programmers : Gerardo Lamastra (lamastra@sssup2.sssup.it) "\
+ " Giuseppe Lipari (lipari@sssup2.sssup.it) "\
+ "Alpha AXP PCI-33 porting by Antonino Casile "\
+ "(casile@sssup1.sssup.it) "\
+ "Research coordinator: Giorgio Buttazzo (giorgio@sssup1.sssup.it)"\
+ " "\
+ " "\
+ " "
+
+static char GreetMsg[1600];
+
+TASK put(void)
+{
+ PORT p;
+
+ strcpy(GreetMsg,STR);
+
+ p = port_create("title",strlen(GreetMsg),1,STREAM,WRITE);
+ while(1) {
+ port_send(p,GreetMsg,BLOCK);
+ task_endcycle();
+ }
+}
+
+TASK ccc(void)
+{
+ WIN w;
+ char *m;
+
+ win_init(&w,68,3,10,3);
+ win_frame(&w,BLACK,WHITE,"CCC",2);
+ puts_xy(70,4,WHITE,"Cab");
+
+ while(1) {
+ m = cab_getmes(cc);
+ puts_xy(72,5,WHITE,m);
+ cab_unget(cc,m);
+ task_endcycle();
+ }
+}
+
+
+TASK write()
+{
+ BYTE c;
+ char *msg;
+
+ while (1) {
+ c = keyb_getchar();
+ if (c == ESC) {
+ esc = TRUE;
+ task_sleep();
+ }
+ else {
+ #ifdef __VPAGING__
+ if (c == 's') {
+ if (get_visual_page() == 0) set_visual_page(1);
+ else if (get_visual_page() == 1) set_visual_page(0);
+ }
+ #endif
+ msg = cab_reserve(cc);
+ msg[0] = c;
+ msg[1] = 0;
+ cab_putmes(cc,msg);
+ }
+ }
+}
+
+#define DELTA 200000.0
+double carico(double rif,BYTE init)
+{
+ double i;
+ DWORD t1 = 0,t2 = 1000;
+ double u;
+
+ i = 0.0;
+ do {
+ i += 1;
+ } while (i <= DELTA);
+
+ u = i / ((double) (t2 - t1));
+
+ if (init) return u;
+ else return (1.0 - u/rif);
+}
+
+void my_end(KEY_EVT *e)
+{
+ sys_end();
+ cprintf("Ctrl-Brk pressed!\n");
+ l1_exit(1);
+}
+
+void res(void)
+{
+ sys_status(NORM_STATUS|BLOCKED_STATUS|SLEEP_STATUS|IDLE_STATUS);
+}
+*/
+
+int main(int argc, char **argv)
+{
+ PID p1,p2; //,p3,p4,p5,p6;
+ HARD_TASK_MODEL m;
+
+/* MODEL m = BASE_MODEL;
+ SYS_PARMS sp = BASE_SYS;
+ KEY_EVT emerg;
+ double rif;
+
+ #ifdef __TRACE__
+ LOG_INFO li = BASE_LOG;
+ log_set_limit(li,9000);
+ log_set_name(li,"aster.hrt");
+ #endif
+ sys_def_nocheck(sp);
+ sys_init(&sp);
+ sys_atexit(res, BEFORE_EXIT);
+
+ #ifdef __TRACE__
+ log_init(&li);
+ #endif
+
+ keyb_init(NULL);
+ keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,my_end);
+
+ #ifdef __VPAGING__
+ set_active_page(1);
+ set_visual_page(1);
+ #endif
+
+
+ CRSR_OFF();
+ clear();
+ puts_xy(0,20,WHITE,"Press ESC to exit demo.");
+ cc = cab_create("Cab",2,2);
+*/
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m,10000);
+ hard_task_def_wcet(m,2000);
+ hard_task_def_group(m,1);
+// periodic_task_def_ctrl_jet(m);
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("Aster.C(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("Aster.C(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+/* p3 = task_create("Title",title,SOFT,PERIODIC,50,&m);
+ if (p3 == -1) {
+ perror();
+ cprintf("Aster.C(main): Could not create task <Title>\n");
+ sys_end();
+ l1_exit(-1);
+ }
+ p4 = task_create("Put",put,SOFT,PERIODIC,1000,&m);
+ if (p4 == -1) {
+ perror();
+ cprintf("Aster.C(main): Could not create task <Put>\n");
+ sys_end();
+ l1_exit(-1);
+ }
+ p5 = task_create("Write",write,NRT,APERIODIC,10,&m);
+ if (p5 == -1) {
+ perror();
+ cprintf("Aster.C(main): Could not create task <Write>\n");
+ sys_end();
+ l1_exit(-1);
+ }
+ p6 = task_create("CabTask",ccc,HARD,PERIODIC,50,&m);
+ if (p6 == -1) {
+ perror();
+ cprintf("Aster.C(main): Could not create task <CabTask>\n");
+ sys_end();
+ l1_exit(-1);
+ }
+ #ifdef __TRACE__
+ log_loop();
+ #endif
+
+ task_activate(p1);
+ task_activate(p2);
+ task_activate(p3);
+ task_activate(p4);
+ task_activate(p5);
+ task_activate(p6);
+
+ group_activate(1);
+
+ while (!esc) {
+ printf_xy(0,21,WHITE,"Clock : %lu",sys_time());
+ }
+
+ #ifdef __TRACE__
+ log_fix();
+ #endif
+ group_kill(1);
+ clear();
+ CRSR_STD();
+ #ifdef __VPAGING__
+ set_active_page(0);
+ set_visual_page(0);
+ #endif
+ sys_end();
+ cprintf("System closed\n");
+ / *
+ sys_status(NORM_STATUS|BLOCKED_STATUS|SLEEP_STATUS|IDLE_STATUS);
+ sys_status(NORM_STATUS|SLEEP_STATUS);
+ */
+
+ group_activate(1);
+
+ {
+ struct timespec t;
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT,&t);
+ kern_sti();
+ } while (t.tv_sec < 6);
+ }
+ kern_cli();
+ sys_status(SCHED_STATUS);
+ sys_end();
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/sysend.c
===================================================================
--- branches/pj/oldexamples/kernel/sysend.c (nonexistent)
+++ branches/pj/oldexamples/kernel/sysend.c (revision 1085)
@@ -0,0 +1,143 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: sysend.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ System termination:
+
+ the main task create J1, J2 and wait until 1 sec., then it calls sys_end
+ and cycles around a task_testcancel
+
+ J1 is a system task that ends at t=1.5 sec.
+
+ J2 is another user task that dies at t= 1.8 sec (it will not die!!!)
+
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+void *J1(void *arg)
+{
+ while (sys_gettime(NULL) < 1500000);
+ kern_printf("J1: t = 1.5 sec, ending...");
+ return 0;
+}
+
+void uscitaJ2(void *arg)
+{
+ kern_printf("J2: AAAARRRRGGGHHH!!! killed by someone, time = %ld\n",sys_gettime(NULL));
+}
+
+void *J2(void *arg)
+{
+ task_cleanup_push(uscitaJ2,NULL);
+
+ while (sys_gettime(NULL) < 1800000);
+ kern_printf("J1: t = 1.8 sec, ending...");
+
+ task_cleanup_pop(0);
+ return 0;
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+void uscitamain(void *arg)
+{
+ kern_printf("main: AAAARRRRGGGHHH!!! killed by someone, time = %ld\n",sys_gettime(NULL));
+}
+
+
+int main(int argc, char **argv)
+{
+ PID err;
+
+ NRT_TASK_MODEL m1, m2;
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+
+ nrt_task_default_model(m1);
+ nrt_task_def_system(m1);
+ nrt_task_def_level(m1,1);
+ nrt_task_default_model(m2);
+ nrt_task_def_level(m2,1);
+
+ kern_printf("main: creating J1\n");
+ err = task_create("J1", J1, (TASK_MODEL *)&m1, NULL);
+ if (err == -1) kern_printf("Error creating J1\n");
+ task_activate(err);
+
+ kern_printf("main: creating J2\n");
+ err = task_create("J2", J2, (TASK_MODEL *)&m2, NULL);
+ if (err == -1) kern_printf("Error creating J2\n");
+ task_activate(err);
+
+ kern_printf("main: waiting 1 sec\n");
+ while (sys_gettime(NULL) < 1000000);
+
+ kern_printf("main: sys_end()\n");
+
+ sys_end();
+
+ task_cleanup_push(uscitamain,NULL);
+
+ while (1)
+ task_testcancel();
+
+ task_cleanup_pop(0);
+
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testw.c
===================================================================
--- branches/pj/oldexamples/kernel/testw.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testw.c (revision 1085)
@@ -0,0 +1,42 @@
+//#include <string.h>
+//#include <stdlib.h>
+//#include <cons.h>
+
+
+#include <kernel/kern.h>
+#include <drivers/keyb.h>
+
+int main(int argc, char **argv)
+{
+ KEY_EVT k;
+ clear();
+ k.ascii = 0;
+ while (k.ascii != ESC) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == '2') {
+ keyb_set_map(itaMap);
+ cprintf("\nItalian Keymap set\n");
+ }
+ if (k.ascii == '3') {
+ keyb_set_map(engMap);
+ cprintf("\nEnglish Keymap set\n");
+ }
+ if (isLeftCtrl(k)) putc_xy(72+0,0,RED,'L');
+ else putc_xy(72+0,0,RED,' ');
+ if (isRightCtrl(k)) putc_xy(72+1,0,RED,'R');
+ else putc_xy(72+1,0,RED,' ');
+ if (isLeftAlt(k)) putc_xy(72+2,0,GREEN,'L');
+ else putc_xy(72+2,0,RED,' ');
+ if (isRightAlt(k)) putc_xy(72+3,0,GREEN,'R');
+ else putc_xy(72+3,0,RED,' ');
+ if (isLeftShift(k)) putc_xy(72+4,0,YELLOW,'L');
+ else putc_xy(72+4,0,RED,' ');
+ if (isRightShift(k)) putc_xy(72+5,0,YELLOW,'R');
+ else putc_xy(72+5,0,RED,' ');
+
+ cprintf("%d [%c]\t",k.scan,k.ascii);
+
+ }
+ sys_end();
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/test7.c
===================================================================
--- branches/pj/oldexamples/kernel/test7.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test7.c (revision 1085)
@@ -0,0 +1,253 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test7.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 7:
+
+ this is a part of the classic Hartik demo Aster.
+
+ It checks:
+ - jet functions
+ - The EDF level with many task, with almost full bandwidth used
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules//edf.h"
+
+int num_aster = 0;
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+// first numbers for wcet and periods are for a 486/25, the others for a
+// celeron 366
+
+#define PER_WCET 13000 /*6200*/
+#define CLOCK_WCET 1200 /* 100*/
+#define ASTER_WCET 1200 /* 100*/
+
+#define ASTER_MEAN_PERIOD 64 /*64*/
+
+#define END_TEST_TIME 50
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000; //10000; // 5000 + rand()%5000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+ HARD_TASK_MODEL m;
+ int r;
+ int x; // adaptive bandwidth...
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,PER_WCET);
+ hard_task_def_ctrl_jet(m);
+
+ x = ASTER_MEAN_PERIOD;
+
+ srand(7);
+ while (1) {
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ hard_task_def_arg(m,(void *)((rand() % 7)+1));
+ hard_task_def_mit(m, (x+r)*1000);
+ p = task_create("aaa",asteroide,&m,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ }
+ else {
+ num_aster++;
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+ kern_sti();
+ i++;
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3; //,p4,p5,p6;
+ HARD_TASK_MODEL m;
+ NRT_TASK_MODEL m_nrt;
+
+ hard_task_default_model(m);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_mit(m,10000);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt,1);
+ nrt_task_def_ctrl_jet(m_nrt);
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,500000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ group_activate(1);
+
+ {
+ struct timespec t;
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_sec < END_TEST_TIME);
+ }
+ //sys_status(SCHED_STATUS);
+ kern_printf("ora chiamo sys_end\n");
+ sys_end();
+ kern_printf("ho chiamato sys_end\n");
+ return 0;
+}
+
+
+
+
Index: branches/pj/oldexamples/kernel/test8.c
===================================================================
--- branches/pj/oldexamples/kernel/test8.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test8.c (revision 1085)
@@ -0,0 +1,81 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test8.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 8:
+
+ timer test
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#define NT 10
+
+int main(int argc, char **argv)
+{
+
+ struct timespec t[NT];
+ int i;
+
+ kern_printf("Test di correttezza ll_gettime(). dura 1 secondo. ");
+
+ for (i=0; i<NT; i++) NULL_TIMESPEC(&t[i]);
+
+ do {
+ for (i=0; i<NT-1; i++) t[i+1] = t[i];
+
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t[0]);
+ kern_sti();
+
+ if (TIMESPEC_A_LT_B(&t[0],&t[1])) {
+ for (i=0; i<NT; i++)
+ kern_printf("%d %ld\n",i, t[i].tv_nsec);
+ sys_end();
+ }
+ } while (t[0].tv_sec < 1);
+
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/test9.c
===================================================================
--- branches/pj/oldexamples/kernel/test9.c (nonexistent)
+++ branches/pj/oldexamples/kernel/test9.c (revision 1085)
@@ -0,0 +1,234 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: test9.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test Number 9:
+
+ same as Test 7, with 8 TBS tasks running
+
+ TBS test
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+
+#if !defined(__TEST1__)
+ THE TEST REQUIRE THE DEFINITION __TEST1__ IN CONFIG.C
+#endif
+
+struct timespec s_stime[10000];
+struct timespec s_send[10000];
+TIME s_curr[10000];
+PID s_PID[10000];
+int useds=0;
+int testactive=1;
+
+TASK pippo()
+{
+ int i;
+ struct timespec t;
+ int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+ } while (t.tv_nsec <= 30000000L);
+}
+
+TASK pippo2()
+{
+ int i;
+ struct timespec t;
+ int last = 0;
+
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+ } while (t.tv_nsec <= 30000000L);
+}
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 15;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 10000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_endcycle();
+
+ if (i==7) testactive = 0;
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper(void *a)
+{
+ int i;
+ int y;
+
+ int load1,j;
+
+ char s[2];
+
+ y = (int) a;
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < 60) {
+ load1 = 100000; //8000 + rand()%2000;
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ puts_xy(i,y,rand()%15+1,s);
+ }
+
+ task_sleep();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+
+int main(int argc, char **argv)
+{
+ struct timespec t;
+ int i;
+ NRT_TASK_MODEL m;
+ HARD_TASK_MODEL m_per;
+ SOFT_TASK_MODEL m_aper;
+ PID p1, p2, p3, p4, p5;
+ int k=1;
+
+ srand(7);
+
+ nrt_task_default_model(m);
+ nrt_task_def_group(m,1);
+
+ p1 = task_create("pippo", pippo, &m, NULL);
+ if (p1 == NIL)
+ { kern_printf("Can't create pippo task...\n"); sys_end(); }
+
+ p2 = task_create("pippo2", pippo2, &m, NULL);
+ if (p2 == NIL)
+ { kern_printf("Can't create pippo2 task...\n"); sys_end(); }
+
+ hard_task_default_model(m_per);
+ hard_task_def_wcet(m_per,6200);
+ hard_task_def_mit(m_per,15000);
+ hard_task_def_group(m_per,1);
+ p3 = task_create("asteroide", asteroide, &m_per, NULL);
+ if (p3 == NIL)
+ { kern_printf("Can't create asteroide task...\n"); sys_end(); }
+
+ soft_task_default_model(m_aper);
+ soft_task_def_wcet(m_aper,62000);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_system(m_aper);
+ soft_task_def_arg(m_aper, 14);
+ soft_task_def_aperiodic(m_aper);
+ p4 = task_create("aper", aper, &m_aper, NULL);
+ if (p4 == NIL)
+ { kern_printf("Can't create aper task...%d \n",errno); sys_end(); }
+
+ soft_task_def_arg(m_aper, 13);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); sys_end(); }
+
+ soft_task_def_arg(m_aper, 12);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); sys_end(); }
+
+ soft_task_def_arg(m_aper, 11);
+ p5 = task_create("aper", aper, &m_aper, NULL);
+ if (p5 == NIL)
+ { kern_printf("Can't create aper(2) task...\n"); sys_end(); }
+
+// kern_printf("p1=%d p2=%d p3=%d p4=%d\n",p1,p2,p3,p4);
+ group_activate(1);
+
+
+// task_kill(p2);
+
+ NULL_TIMESPEC(&t);
+ do {
+ kern_cli();
+ ll_gettime(TIME_EXACT, &t);
+ kern_sti();
+
+// task_kill(p3);
+ } while (t.tv_sec < 1);
+ testactive = 0;
+/*
+ kern_printf("FINE MAIN time=%d useds=%d\n",ll_gettime(TIME_EXACT,NULL),useds);
+ for (i=0; i<useds; i++)
+ kern_printf("%6d: pid %-9d stime %-9d reschedule %-9d avail %-9d\n",i,
+ s_PID[i], s_stime[i].tv_nsec, s_send[i].tv_nsec, s_curr[i]);
+*/
+ return 0;
+}
Index: branches/pj/oldexamples/kernel/testz.c
===================================================================
--- branches/pj/oldexamples/kernel/testz.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testz.c (revision 1085)
@@ -0,0 +1,456 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testz.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Author: Gerardo Lamastra
+ Giuseppe Lipari
+ Date: 1/10/96
+
+ File: Aster.C
+ Revision: 1.6
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ Well, this is only a stupid demo which intend to show many
+ HARTIK+ capabilities; the application is structured in the followig
+ way: there is an ASTER task wich randomly creates some ASTEROID tasks
+ which are displayed into the first window; each task is HARD/PERIODIC
+ and auto-kills itself when it reaches the window end!
+ An other couple of tasks, TITLE & PUT give an example of port
+ communication facility; the server task creates the port, the client
+ task connect to it and uses the server to accomplish some stuff.
+ Port can be declared READ/WRITE and can model ONE-TO-ONE communication
+ or MANY-TO-ONE communication.
+ Finally a second couple of tasks realizes a communiation through CABs;
+ each time a key is pressed, the ascii code is posted into the CAB by the
+ CCC task while the second task, WRITE, displays it on the screen and
+ perform other silly actions.
+ Finally a CLOCK task is implemented to test system clock.
+ Please note that usually the HARTIK+ application is made up of a task
+ group which interacts among them, while the main() function, which
+ became a task itself when the kernel is activated, is suspended until
+ the system is ready to terminate; the MAIN task can also be used to make
+ other background activities, but it should not be killed; when the
+ application terminates, the control is passed to MAIN which kills
+ everybody, shut down the system and can handle other operations using
+ the services available with the previou operating system (I.E. the DOS).
+ If you need to manage sudden abort/exception you should install your own
+ exception handler and raise it through the exc_raise() primitive to
+ make the system abort safely!
+ Remember that the exit functions posted through sys_atexit() will be
+ executed in both cases, to allow clean system shutdown.
+*/
+
+//#include <string.h>
+//#include <stdlib.h>
+
+#include <kernel/kern.h>
+#include <modules/sem.h>
+#include <modules/hartport.h>
+#include <modules/cabs.h>
+#include <drivers/keyb.h>
+#include <string.h>
+
+
+#define __VPAGING__
+
+
+#ifdef __TRACE__
+#undef __TRACE__
+#endif
+
+/* #define __TRACE__ */
+
+#ifdef __TRACE__
+#include "sys\log.h"
+#endif
+
+#include <drivers/keyb.h>
+//#include cons.h
+#include <drivers/crtwin.h>
+
+int num_aster = 0;
+#define ASTER_LIM 67
+
+CAB cc;
+BYTE esc = FALSE;
+
+TASK asteroide(void)
+{
+ int i = 1;
+ int y = rand() % 7 + 1;
+ while (i < ASTER_LIM) {
+ puts_xy(i,y,WHITE,"*");
+ task_endcycle();
+
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ num_aster--;
+ return 0;
+}
+
+DWORD taskCreated = 0;
+
+TASK aster(void)
+{
+ PID p;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ WIN w;
+
+ win_init(&w,0,0,ASTER_LIM,8);
+ win_frame(&w,BLACK,WHITE,"Asteroids",2);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,2000);
+ soft_task_def_ctrl_jet(m_soft);
+
+ srand(7);
+ while (1) {
+ if (num_aster < 5) {
+ r = (rand() % 50) - 25;
+ soft_task_def_arg(m_soft,(void *)((rand() % 7)+1));
+ soft_task_def_period(m_soft,(50 + r)*1000);
+ p = task_create("aaa",asteroide,(TASK_MODEL *)&m_soft,NULL);
+ taskCreated++;
+ task_activate(p);
+ num_aster++;
+ }
+
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ WIN w;
+ int s = 0, m = 0;
+
+ win_init(&w,68,0,11,2);
+ win_frame(&w,BLACK,WHITE,"Clk",1);
+
+ while(1) {
+ printf_xy(70,1,WHITE,"%2d : %2d",m,s);
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(70,1,WHITE,"%2d : %2d",m,s);
+ task_endcycle();
+ }
+}
+
+TASK title()
+{
+ PORT t;
+ WIN w;
+ int i,pos = 77;
+ char msg[85],tmp[85],ss[2];
+ BYTE c;
+
+ win_init(&w,0,9,79,2);
+ win_frame(&w,BLACK,WHITE,"Title",2);
+
+ for (i=0; i < 77; i++) msg[i] = ' ';
+ msg[77] = 0;
+
+ t = port_connect("title",1,STREAM,READ);
+
+ while (1) {
+ port_receive(t,&c,BLOCK);
+ ss[0] = c;
+ ss[1] = 0;
+ strcat(msg,ss);
+ puts_xy(1,10,WHITE,msg);
+ pos++;
+ if (pos > 77) {
+ strcpy(tmp,&(msg[1]));
+ tmp[pos-1] = 0;
+ pos -= 1;
+ strcpy(msg,tmp);
+ }
+ task_endcycle();
+ }
+}
+
+#define STR "..................... Hartik+ ....................."\
+ " Guarantees hard tasks "\
+ " Includes soft periodic tasks "\
+ "TB server for decrementing the aperiodic response time "\
+ "SRP for both hard & soft aperiodic tasks "\
+ "Portability toward other compilers/system "\
+ "Support for different C compiler: Watcom C 16 bit & 32 bit"\
+ " -- GNU C (32 bit) -- Borland C (16 bit) -- MS C (16 bit)"\
+ " "\
+ "Programmers : Gerardo Lamastra (lamastra@sssup2.sssup.it) "\
+ " Giuseppe Lipari (lipari@sssup2.sssup.it) "\
+ "Alpha AXP PCI-33 porting by Antonino Casile "\
+ "(casile@sssup1.sssup.it) "\
+ "Research coordinator: Giorgio Buttazzo (giorgio@sssup1.sssup.it)"\
+ " "\
+ " "\
+ " "
+
+static char GreetMsg[1600];
+
+TASK put(void)
+{
+ PORT p;
+
+ strcpy(GreetMsg,STR);
+
+ p = port_create("title",strlen(GreetMsg),1,STREAM,WRITE);
+ while(1) {
+ port_send(p,GreetMsg,BLOCK);
+ task_endcycle();
+ }
+}
+
+TASK ccc(void)
+{
+ WIN w;
+ char *m;
+
+ win_init(&w,68,3,10,3);
+ win_frame(&w,BLACK,WHITE,"CCC",2);
+ puts_xy(70,4,WHITE,"Cab");
+
+ while(1) {
+ m = cab_getmes(cc);
+ puts_xy(72,5,WHITE,m);
+ cab_unget(cc,m);
+ task_endcycle();
+ }
+}
+
+
+TASK write_keyb()
+{
+ BYTE c;
+ char *msg;
+
+ while (1) {
+ c = keyb_getchar();
+ if (c == ESC) {
+ esc = TRUE;
+ task_sleep();
+ }
+ else {
+ #ifdef __VPAGING__
+ if (c == 's') {
+ if (get_visual_page() == 0) set_visual_page(1);
+ else if (get_visual_page() == 1) set_visual_page(0);
+ }
+ #endif
+ msg = cab_reserve(cc);
+ msg[0] = c;
+ msg[1] = 0;
+ cab_putmes(cc,msg);
+ }
+ }
+}
+
+#define DELTA 200000.0
+double carico(double rif,BYTE init)
+{
+ double i;
+ DWORD t1 = 0,t2 = 1000;
+ double u;
+
+ i = 0.0;
+ do {
+ i += 1;
+ } while (i <= DELTA);
+
+ u = i / ((double) (t2 - t1));
+
+ if (init) return u;
+ else return (1.0 - u/rif);
+}
+
+void my_end(KEY_EVT *e)
+{
+ set_active_page(0);
+ set_visual_page(0);
+ cprintf("Ctrl-Brk pressed!\n");
+ sys_end();
+}
+
+void res(void *arg)
+{
+ sys_status(CLOCK_STATUS|SCHED_STATUS);
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3,p4,p5,p6;
+
+ HARD_TASK_MODEL m_per;
+ SOFT_TASK_MODEL m_soft;
+ NRT_TASK_MODEL m_nrt;
+
+ KEY_EVT emerg;
+// double rif;
+ struct timespec t;
+
+ #ifdef __TRACE__
+ LOG_INFO li = BASE_LOG;
+ log_set_limit(li,9000);
+ log_set_name(li,"aster.hrt");
+ #endif
+
+ sys_atrunlevel(res, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ #ifdef __TRACE__
+ log_init(&li);
+ #endif
+
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,my_end);
+
+ #ifdef __VPAGING__
+ set_active_page(1);
+ set_visual_page(1);
+ #endif
+
+
+ CRSR_OFF();
+ clear();
+ puts_xy(0,20,WHITE,"Press ESC to exit demo.");
+ cc = cab_create("Cab",2,2);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_period(m_soft,500000);
+ soft_task_def_met(m_soft,1000);
+ soft_task_def_group(m_soft, 1);
+ p1 = task_create("Aster",aster,&m_soft,NULL);
+ if (p1 == -1) {
+ perror("Aster.C(main): Could not create task <aster>");
+ sys_abort(-1);
+ }
+
+ hard_task_default_model(m_per);
+ hard_task_def_mit(m_per,500000);
+ hard_task_def_wcet(m_per,1000);
+ hard_task_def_group(m_per, 1);
+ p2 = task_create("Clock",clock,&m_per,NULL);
+ if (p2 == -1) {
+ perror("Aster.C(main): Could not create task <Clock>");
+ sys_abort(-1);
+ }
+
+ soft_task_def_period(m_soft, 50000);
+ p3 = task_create("Title",title,&m_soft, NULL);
+ if (p3 == -1) {
+ perror("Aster.C(main): Could not create task <Title>");
+ sys_abort(-1);
+ }
+
+ soft_task_def_period(m_soft, 1000000);
+ p4 = task_create("Put",put,&m_soft, NULL);
+ if (p4 == -1) {
+ perror("Aster.C(main): Could not create task <Put>");
+ sys_abort(-1);
+ }
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt, 1);
+ p5 = task_create("Write",write_keyb,&m_nrt,NULL);
+ if (p5 == -1) {
+ perror("Aster.C(main): Could not create task <Write>");
+ sys_abort(-1);
+ }
+
+ hard_task_def_mit(m_per, 50000);
+ p6 = task_create("CabTask",ccc,&m_per,NULL);
+ if (p6 == -1) {
+ perror("Aster.C(main): Could not create task <CabTask>\n");
+ sys_abort(-1);
+ }
+ #ifdef __TRACE__
+ log_loop();
+ #endif
+ /*
+ task_activate(p1);
+ task_activate(p2);
+ task_activate(p3);
+ task_activate(p4);
+ task_activate(p5);
+ task_activate(p6);
+ */
+ group_activate(1);
+
+ while (!esc) {
+ kern_cli();
+ ll_gettime(TIME_EXACT,&t);
+ kern_sti();
+
+ printf_xy(0,21,WHITE,"Clock : %-9ds %-9dns",(int)t.tv_sec, (int)t.tv_nsec);
+ }
+
+ #ifdef __TRACE__
+ log_fix();
+ #endif
+ group_kill(1);
+ clear();
+ CRSR_STD();
+ #ifdef __VPAGING__
+ set_active_page(0);
+ set_visual_page(0);
+ #endif
+ cprintf("System closed\n");
+ sys_end();
+ /*
+ sys_status(NORM_STATUS|BLOCKED_STATUS|SLEEP_STATUS|IDLE_STATUS);
+ sys_status(NORM_STATUS|SLEEP_STATUS);
+ */
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/testss.c
===================================================================
--- branches/pj/oldexamples/kernel/testss.c (nonexistent)
+++ branches/pj/oldexamples/kernel/testss.c (revision 1085)
@@ -0,0 +1,547 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testss.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:48 $
+ ------------
+
+ Test for Sporadic Server (ss):
+
+ this is a part of the classic Hartik demo Aster.
+
+ it is based on test 17 (h), and the JobControl Task uses an
+ SOFT_TASK_MODEL served by a sporadic server
+ There are two "dummy" tasks that increment a counter and print
+ the value. One uses a SOFT_TASK_MODEL served by sporadic server,
+ the other uses a NRT_TASK_MODEL handled by RR module.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/ss.h"
+#include "drivers/keyb.h"
+
+int num_aster = 0;
+#define EDF_LEV 0
+#define CBS_LEV 1
+#define SS_LEV 2
+
+#define ASTER_LIM 60
+#define DISPLAY_MAX 8
+#define ASTER_MAX 70
+#define STAT_Y 9
+
+#define PER_MAX 5
+#define APER_MAX 8
+
+#define PER_WCET 16000
+#define APER_WCET 22000
+#define JET_WCET 20000
+
+#define APER_REP 22000
+
+PID aper_table[APER_MAX];
+
+mutex_t m1;
+
+
+#define PIMUTEX
+//#define PCMUTEX
+//#define NPPMUTEX
+//#define NOPMUTEX
+
+#define LONGSC
+
+#ifdef LONGSC
+#define SOFT_MET 12000 /* 12000 */
+#define CLOCK_WCET 300 /* 300*/
+#define ASTER_WCET 300 /* 300*/
+#else
+#define SOFT_MET 5000 /* 4500 */
+#define CLOCK_WCET 2000 /* 200*/
+#define ASTER_WCET 2000 /* 200*/
+#endif
+
+PID p1,p2,p3,p4,p5;
+
+TASK asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 10000; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ #ifdef LONGSC
+ mutex_unlock(&m1);
+ #endif
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ //num_aster--;
+}
+
+TASK aper_asteroid(void *a)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+ int c;
+
+ char s[2];
+
+ c = (int)a;
+ s[0] = '*'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = APER_REP; //8000 + rand()%2000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = c;
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ mutex_lock(&m1);
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+}
+
+TASK soft_aster(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = '*'; s[1] = 0;
+
+ /*for (;;)*/ {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 1000 + rand()%9000;
+ #ifdef LONGSC
+ mutex_lock(&m1);
+ #endif
+ for (j=0; j<load1; j++) {
+ s[0] = '*' + rand() % 100;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ puts_xy(i,y,rand()%15+1,s);
+ #ifndef LONGSC
+ mutex_unlock(&m1);
+ #endif
+ }
+ s[0] = 1;
+ #ifndef LONGSC
+ mutex_lock(&m1);
+ #endif
+ //mutex_lock(&m1);
+ puts_xy(i,y,rand()%15+1,s);
+ mutex_unlock(&m1);
+
+ task_activate(aper_table[rand()%APER_MAX]);
+ task_endcycle();
+
+ mutex_lock(&m1);
+ puts_xy(i,y,WHITE," ");
+ mutex_unlock(&m1);
+ i++;
+ }
+ }
+ num_aster--;
+ return 0;
+}
+
+TASK aster()
+{
+ PID p;
+
+// HARD_TASK_MODEL m;
+ SOFT_TASK_MODEL m_soft;
+ int r;
+ int x; // adaptive bandwidth...
+
+ srand(7);
+
+/* periodic_task_default_model(m,0,PER_WCET);
+ periodic_task_def_ctrl_jet(m);
+ for (x=0; x<PER_MAX; x++) {
+ r = (rand() % 200);
+ periodic_task_def_period(m, (64+r)*1000);
+ p = task_create("per",asteroide,&m,NULL);
+ if (p!=-1) task_activate(p);
+ }
+*/
+ soft_task_default_model(m_soft);
+ soft_task_def_met(m_soft,SOFT_MET);
+ soft_task_def_ctrl_jet(m_soft);
+// soft_task_def_aperiodic(m_soft);
+
+ x = 128; //64;
+
+ while (1) {
+/* {
+ PID p;
+ int x;
+ p = level_table[0]->level_scheduler(0);
+ printf_xy(1,8,WHITE," ");
+
+ x = 0;
+ do {
+ printf_xy(3*x+1,8,WHITE,"%3d",p);
+ p = proc_table[p].next;
+ x++;
+ } while (p != NIL);
+ }
+*/
+ if (num_aster < ASTER_MAX) {
+ r = (rand() % 200);
+
+ soft_task_def_period(m_soft, (x+r)*1000);
+ p = task_create("aaa",soft_aster,&m_soft,NULL);
+ if (p == -1)
+ {
+ if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u err=%d",freedesc,errno);
+ mutex_unlock(&m1);
+ }
+ else {
+ num_aster++;
+ mutex_lock(&m1);
+ printf_xy(62,3,WHITE,"adapt=%3u ",x);
+ mutex_unlock(&m1);
+ task_activate(p);
+ x /= 2;
+ if (x<50) x = 50;
+ }
+ }
+ task_endcycle();
+ }
+}
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV));
+ printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV));
+ mutex_unlock(&m1);
+
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ mutex_lock(&m1);
+ printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
+ printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV));
+ printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV));
+ mutex_unlock(&m1);
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ mutex_lock(&m1);
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ mutex_unlock(&m1);
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
+ (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
+ (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ mutex_lock(&m1);
+ if (proc_table[p].task_level == 1)
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
+ else
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
+ p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
+// p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]);
+ mutex_unlock(&m1);
+ i++;
+ task_activate(p3);
+ task_endcycle();
+ }
+ }
+}
+
+void fine(KEY_EVT *e)
+{
+ sys_end();
+}
+
+void mydummyaper(void) {
+ int i=0;
+ while(1) {
+ mutex_lock(&m1);
+ printf_xy(1,24,RED,"dummyAPER pid=%d: %d",p4,i++);
+ mutex_unlock(&m1);
+ task_activate(p4);
+ task_endcycle();
+ }
+}
+
+void mydummynrt(void) {
+ int i=0;
+ while(1) {
+ mutex_lock(&m1);
+ printf_xy(40,24,RED,"dummyNRT pid=%d: %d",p5,i++);
+ mutex_unlock(&m1);
+ }
+}
+
+int main(int argc, char **argv)
+{
+// PID p1,p2,p5;
+ HARD_TASK_MODEL m;
+ NRT_TASK_MODEL m_nrt;
+ SOFT_TASK_MODEL m_aper;
+ SOFT_TASK_MODEL m_soft;
+ struct timespec fineprg;
+
+ #ifdef PIMUTEX
+ PI_mutexattr_t a;
+ #endif
+
+ #ifdef PCMUTEX
+ PC_mutexattr_t a;
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_t a;
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_t a;
+ #endif
+
+
+ KEY_EVT emerg;
+ //keyb_set_map(itaMap);
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg,fine);
+
+ hard_task_default_model(m);
+ hard_task_def_mit(m,100000);
+ hard_task_def_wcet(m,ASTER_WCET);
+ hard_task_def_group(m,1);
+ hard_task_def_ctrl_jet(m);
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_group(m_nrt,1);
+ nrt_task_def_ctrl_jet(m_nrt);
+
+
+ soft_task_default_model(m_aper);
+ soft_task_def_group(m_aper,1);
+ soft_task_def_ctrl_jet(m_aper);
+ soft_task_def_aperiodic(m_aper);
+
+ soft_task_default_model(m_soft);
+ soft_task_def_period(m_soft,10000);
+ soft_task_def_met(m_soft,JET_WCET);
+ soft_task_def_group(m_soft,1);
+ soft_task_def_ctrl_jet(m_soft);
+ soft_task_def_aperiodic(m_soft);
+
+
+ p1 = task_create("Aster",aster,&m,NULL);
+ if (p1 == -1) {
+ perror("test7.c(main): Could not create task <aster> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ hard_task_def_mit(m,50000);
+ hard_task_def_wcet(m,CLOCK_WCET);
+ p2 = task_create("Clock",clock,&m,NULL);
+ if (p2 == -1) {
+ perror("test7.c(main): Could not create task <Clock> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
+ p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
+ if (p3 == -1) {
+ perror("test7.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ p4 = task_create("MyDummyAper",(void *(*)(void*))mydummyaper,&m_aper,NULL);
+ if (p4 == -1) {
+ perror("Could not create task <MyDummyAper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+
+ p5 = task_create("MyDummyNRT",(void *(*)(void*))mydummynrt,&m_nrt,NULL);
+ if (p5 == -1) {
+ perror("Could not create task <MyDummyNRT> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+/*
+ aperiodic_task_default_model(m_aper,APER_WCET);
+ aperiodic_task_def_ctrl_jet(m_aper);
+ aperiodic_task_def_system(m_aper);
+
+ for (i=0; i<APER_MAX; i++) {
+ aperiodic_task_def_level(m_aper, i/4 + 2);
+ aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
+ aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
+ if (aper_table[i] == -1) {
+ perror("test7.c(main): Could not create task <aper> ...");
+ sys_end();
+ l1_exit(-1);
+ }
+ }
+*/
+// task_nopreempt();
+
+
+ #ifdef PIMUTEX
+ PI_mutexattr_default(a);
+ #endif
+
+ #ifdef PCMUTEX
+ PC_mutexattr_default(a);
+ #endif
+
+ #ifdef NPPMUTEX
+ NPP_mutexattr_default(a);
+ #endif
+
+ #ifdef NOPMUTEX
+ NOP_mutexattr_default(a);
+ #endif
+
+ mutex_init(&m1, &a);
+
+ fineprg.tv_sec = 1800;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/oldexamples/kernel/makefile
===================================================================
--- branches/pj/oldexamples/kernel/makefile (nonexistent)
+++ branches/pj/oldexamples/kernel/makefile (revision 1085)
@@ -0,0 +1,97 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= test4 test5 test6 test7 test8 testa testc testd teste testf testg
+PROGS+= testh testi testj testk testl testm testn testo testp
+PROGS+= testq testr tests testu testw testz testss
+PROGS+= ptest1 ptest2 ptest3 ptest4 ptest5 ptest6 sysend
+PROGS+= perf1 perf2 perf3 perf4
+
+include $(BASE)/config/example.mk
+
+test4:
+ make -f $(SUBMAKE) APP=test4 INIT=init1.o OTHEROBJS=
+test5:
+ make -f $(SUBMAKE) APP=test5 INIT=init1.o OTHEROBJS=
+test6:
+ make -f $(SUBMAKE) APP=test6 INIT=init2.o OTHEROBJS=
+test7:
+ make -f $(SUBMAKE) APP=test7 INIT=init2.o OTHEROBJS=
+test8:
+ make -f $(SUBMAKE) APP=test8 INIT=init2.o OTHEROBJS=
+testa:
+ make -f $(SUBMAKE) APP=testa INIT=init3.o OTHEROBJS=
+testc:
+ make -f $(SUBMAKE) APP=testc INIT=init4.o OTHEROBJS=
+testd:
+ make -f $(SUBMAKE) APP=testd INIT=init5.o OTHEROBJS=
+teste:
+ make -f $(SUBMAKE) APP=teste INIT=init6.o OTHEROBJS=
+testf:
+ make -f $(SUBMAKE) APP=testf INIT=h3pi.o OTHEROBJS=
+testg:
+ make -f $(SUBMAKE) APP=testg INIT=initg.o OTHEROBJS=
+testh:
+ make -f $(SUBMAKE) APP=testh INIT=h3pi.o OTHEROBJS=
+testi:
+ make -f $(SUBMAKE) APP=testi INIT=h3pi.o OTHEROBJS=
+testj:
+ make -f $(SUBMAKE) APP=testj INIT=h3pi.o OTHEROBJS=
+testk:
+ make -f $(SUBMAKE) APP=testk INIT=h3pi.o OTHEROBJS=
+testl:
+ make -f $(SUBMAKE) APP=testl INIT=h3pips.o OTHEROBJS=
+testm:
+ make -f $(SUBMAKE) APP=testm INIT=rm1.o OTHEROBJS=
+testn:
+ make -f $(SUBMAKE) APP=testn INIT=hartik3.o OTHEROBJS=
+testo:
+ make -f $(SUBMAKE) APP=testo INIT=hartik3.o OTHEROBJS=
+testp:
+ make -f $(SUBMAKE) APP=testp INIT=hartik3.o OTHEROBJS=
+testq:
+ make -f $(SUBMAKE) APP=testq INIT=h3pips.o OTHEROBJS=
+testr:
+ make -f $(SUBMAKE) APP=testr INIT=h3pips.o OTHEROBJS=
+tests:
+ make -f $(SUBMAKE) APP=tests INIT=hartik3.o OTHEROBJS=
+testu:
+ make -f $(SUBMAKE) APP=testu INIT=h3pips.o OTHEROBJS=
+testw:
+ make -f $(SUBMAKE) APP=testw INIT=pinit.o OTHEROBJS=
+testz:
+ make -f $(SUBMAKE) APP=testz INIT=hartik3.o OTHEROBJS=
+testss:
+ make -f $(SUBMAKE) APP=testss INIT=h3piss.o OTHEROBJS=
+
+
+ptest1:
+ make -f $(SUBMAKE) APP=ptest1 INIT=pinit.o OTHEROBJS=
+ptest2:
+ make -f $(SUBMAKE) APP=ptest2 INIT=pinit.o OTHEROBJS=
+ptest3:
+ make -f $(SUBMAKE) APP=ptest3 INIT=pinit.o OTHEROBJS=
+ptest4:
+ make -f $(SUBMAKE) APP=ptest4 INIT=pinit.o OTHEROBJS=
+ptest5:
+ make -f $(SUBMAKE) APP=ptest5 INIT=pinit.o OTHEROBJS=
+ptest6:
+ make -f $(SUBMAKE) APP=ptest6 INIT=pinit.o OTHEROBJS=
+sysend:
+ make -f $(SUBMAKE) APP=sysend INIT=init1.o OTHEROBJS=
+
+perf1:
+ make -f $(SUBMAKE) APP=perf1 INIT= OTHEROBJS=
+perf2:
+ make -f $(SUBMAKE) APP=perf2 INIT=init5.o OTHEROBJS=
+perf3:
+ make -f $(SUBMAKE) APP=perf3 INIT=init5.o OTHEROBJS=
+perf4:
+ make -f $(SUBMAKE) APP=perf4 INIT= OTHEROBJS=
+
Index: branches/pj/oldexamples/stdio/test0.c
===================================================================
--- branches/pj/oldexamples/stdio/test0.c (nonexistent)
+++ branches/pj/oldexamples/stdio/test0.c (revision 1085)
@@ -0,0 +1,72 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ fin=NULL;
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA1.TXT","r");
+ cprintf("opened!\n");
+
+ cprintf("res=%p\n",fin);
+
+ if (fin!=NULL) {
+
+ while (!feof(fin)) {
+
+ memset(buffer,'@',sizeof(buffer));
+
+ cprintf("reading...\n");
+ res=fread(buffer,1,sizeof(buffer)-1,fin);
+ cprintf("read!\n");
+
+ cprintf("res=%i\n",res);
+ buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
+ cprintf("'%s'\n",buffer);
+
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getch(BLOCK)) != 'x') ;
+
+ return 0;
+}
Index: branches/pj/oldexamples/stdio/test1.c
===================================================================
--- branches/pj/oldexamples/stdio/test1.c (nonexistent)
+++ branches/pj/oldexamples/stdio/test1.c (revision 1085)
@@ -0,0 +1,67 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ char *s;
+ // int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA2.TXT","r");
+ cprintf("opened!\n");
+
+ if (fin!=NULL) {
+
+ while (!feof(fin)) {
+ cprintf("getting line...\n");
+ s=fgets(buffer,sizeof(buffer),fin);
+ cprintf("got!\n");
+ if (s==NULL) {
+ if (ferror(fin))
+ cprintf("error while using fgets()!\n");
+ break;
+ }
+ cprintf("'%s'\n",buffer);
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: branches/pj/oldexamples/stdio/test2.c
===================================================================
--- branches/pj/oldexamples/stdio/test2.c (nonexistent)
+++ branches/pj/oldexamples/stdio/test2.c (revision 1085)
@@ -0,0 +1,91 @@
+/*
+ *
+ *
+ *
+ */
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ char *s;
+ int res;
+ int c,n;
+ char ch;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA2.TXT","r");
+ cprintf("opened!\n");
+
+ if (fin!=NULL) {
+
+ n=-1;
+ cprintf("fscanf()ing...\n");
+ res=fscanf(fin,"number %i",&n);
+ cprintf("fscanf()ed...\n");
+ if (res!=1) {
+ cprintf("error on 1st fscanf() res=%i\n",res);
+ return 0;
+ }
+ cprintf("scanned number %i (exact 103)\n",n);
+
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 1st fgets()\n");
+ return 0;
+ }
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 2nd fgets()\n");
+ return 0;
+ }
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 3rd fgets()\n");
+ return 0;
+ }
+
+ cprintf("fscanf()ing...\n");
+ res=fscanf(fin,"line %i error letter '%c'",&n,&ch);
+ cprintf("fscanf()ed...\n");
+ if (res!=2) {
+ cprintf("error on 2nd fscanf() res=%i\n",res);
+ return 0;
+ }
+ cprintf("scanned number %i (exact 205) characer '%c' (exact 'c')\n",n,ch);
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: branches/pj/oldexamples/stdio/test3.c
===================================================================
--- branches/pj/oldexamples/stdio/test3.c (nonexistent)
+++ branches/pj/oldexamples/stdio/test3.c (revision 1085)
@@ -0,0 +1,55 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ char *s;
+ // int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ printf("try using printf() to write on console!\n");
+ printf("second line of the test\n");
+ fprintf(stdout,"using fprintf() to write on stdout\n");
+ fprintf(stderr,"try using fprintf() to write on stderr!\n");
+ fprintf(stderr,"all this %i message are using ?printf() functions\n",4);
+
+ printf("now try to write a phrase and press [Enter] to finish\n");
+ s=fgets(buffer,sizeof(buffer),stdin);
+ if (s!=NULL) printf("you have typed: '%s'\n",s);
+
+ cprintf("[press 'x' to exit]\n");
+
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: branches/pj/oldexamples/stdio/test4.c
===================================================================
--- branches/pj/oldexamples/stdio/test4.c (nonexistent)
+++ branches/pj/oldexamples/stdio/test4.c (revision 1085)
@@ -0,0 +1,60 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ int res;
+ int c;
+ int flag=1;
+
+ /* prova di rewind() */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA1.TXT","r");
+ cprintf("opened!\n");
+
+ cprintf("res=%p\n",fin);
+
+ if (fin!=NULL) {
+
+ REDO:
+
+ while (!feof(fin)) {
+ cprintf("reading...\n");
+ res=fread(buffer,1,sizeof(buffer)-2,fin);
+ cprintf("read!\n");
+
+ cprintf("res=%i\n",res);
+ buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
+ cprintf("'%s'\n",buffer);
+ }
+
+ if (flag) {
+ flag=0;
+ cprintf("rewinding...\n");
+ rewind(fin);
+ cprintf("rewinded!\n");
+ goto REDO;
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getch(BLOCK)) != 'x') ;
+
+ return 0;
+}
Index: branches/pj/oldexamples/stdio/common.c
===================================================================
--- branches/pj/oldexamples/stdio/common.c (nonexistent)
+++ branches/pj/oldexamples/stdio/common.c (revision 1085)
@@ -0,0 +1,118 @@
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* -- */
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+__dev_t root_device;
+__dev_t temp_device;
+
+int choose_root_callback(__dev_t dev,__uint8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+/* -- */
+
+//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+/* -- */
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ return 0;
+}
+
+/* -- */
+
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ //dump_sem_table();
+ //dump_nop_table();
+ //sys_status(SCHED_STATUS);
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
Index: branches/pj/oldexamples/stdio/makefile
===================================================================
--- branches/pj/oldexamples/stdio/makefile (nonexistent)
+++ branches/pj/oldexamples/stdio/makefile (revision 1085)
@@ -0,0 +1,28 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS=test0 test1 test2 test3 test4
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+test0:
+ make -f $(SUBMAKE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
+
+test1:
+ make -f $(SUBMAKE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
+
+test2:
+ make -f $(SUBMAKE) APP=test2 INIT=initfs.o OTHEROBJS=common.o
+
+test3:
+ make -f $(SUBMAKE) APP=test3 INIT=initfs.o OTHEROBJS=common.o
+
+test4:
+ make -f $(SUBMAKE) APP=test4 INIT=initfs.o OTHEROBJS=common.o
Index: branches/pj/oldexamples/fs/test0.c
===================================================================
--- branches/pj/oldexamples/fs/test0.c (nonexistent)
+++ branches/pj/oldexamples/fs/test0.c (revision 1085)
@@ -0,0 +1,63 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/ALFA1.TXT"
+
+int main(int argc,char *argv[])
+{
+ int c;
+ int h;
+ // int res;
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+ if (h>=0) {
+ char buffer[128];
+ int len;
+ cprintf("OPENED!\n");
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ //close(h);
+
+ } else
+ cprintf("FAILED!\n");
+
+ cprintf("Press [x] to exit\n");
+
+ while ((c = keyb_getchar()) != 'x') ;
+
+ //bdev_dump_status();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/tree1.c
===================================================================
--- branches/pj/oldexamples/fs/tree1.c (nonexistent)
+++ branches/pj/oldexamples/fs/tree1.c (revision 1085)
@@ -0,0 +1,154 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#define FROMDIR "/TEMP"
+
+char pathname[8192];
+
+int noscroll=1;
+
+static int counter=0;
+
+void viewdir(int prof)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ //int i;
+ //static int flag=0;
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ cprintf("ERR: can't open dir %s (errno: %i)\n",pathname,errno);
+ return;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ {
+ //int c='p';
+ //c = keyb_getchar();
+ //if (c=='z') inode_stats();
+ }
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ /*
+ if (!strcmp(den->d_name,"eport.ror")) {
+ if (flag==0) debug_info_show(1);
+ flag++;
+ // inode_stats();
+ }
+ */
+
+ if (counter==22100) noscroll=0;
+
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ cprintf("%05i %s\n",++counter,pathname);
+ //dcache_stats();
+
+ if (!strcmp(den->d_name,".")) goto SKIP;
+ if (!strcmp(den->d_name,"..")) goto SKIP;
+
+ //goto SKIP;
+
+ /*
+ if (!strcmp("MSINH.C",den->d_name)) {
+ //if (!strcmp("WDIN32.OBJ",den->d_name)) {
+ cprintf(">>>START SHOWING DEBUG INFO<<<\n");
+ noscroll=0;
+ //inode_stats();
+ debug_info_show(1);
+ }
+ */
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ cprintf("can't stat %s\n",pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sys_end();
+ l1_exit(0);
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ viewdir(prof+1);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+}
+
+int main(int argc,char *argv[])
+{
+ // int res;
+
+ //if (noscroll) clear();
+
+ //strcpy(pathname,"/");
+ //viewdir(0);
+
+ showmessage("Try to show all filenames from a directory recursively\n"
+ "using one NRT task.\n");
+
+ noscroll=0;
+ strcpy(pathname,FROMDIR);
+ viewdir(0);
+
+ //dump_dentry_tree();
+
+ /*
+ *
+ */
+
+ /*
+ res=umount(temp_device);
+ //dump_dentry_tree();
+ if (res!=0) {
+ cprintf("can't unmount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ //sys_end();
+ return -1;
+ }
+ */
+
+ //bdev_dump_status();
+
+ sys_end();
+ return 0;
+}
Index: branches/pj/oldexamples/fs/test1.c
===================================================================
--- branches/pj/oldexamples/fs/test1.c (nonexistent)
+++ branches/pj/oldexamples/fs/test1.c (revision 1085)
@@ -0,0 +1,74 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+//#define FILENAME "/temp/ALFA1.TXT"
+
+#define FILENAME "/pippo.c"
+
+int leggi(int h)
+{
+ char buffer[124];
+ int len;
+
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer)-1);
+ cprintf("READ %i bytes\n",len);
+ cprintf("buffer='%s'\n",buffer);
+
+ return len;
+}
+
+int main(int argc,char *argv[])
+{
+ int h;
+
+ showmessage("Try lseek() using a file for reading.");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+
+ if (h>=0) {
+ cprintf("OPENED!\n");
+
+ leggi(h);
+ leggi(h);
+ leggi(h);
+
+ cprintf("SEEK to 16\n");
+ lseek(h,16,SEEK_SET);
+
+ leggi(h);
+
+ cprintf("SEEK to %i\n",123*3+1);
+ lseek(h,123*3+1,SEEK_SET);
+
+ leggi(h);
+
+ } else
+ cprintf("FAILED!\n");
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/test2.c
===================================================================
--- branches/pj/oldexamples/fs/test2.c (nonexistent)
+++ branches/pj/oldexamples/fs/test2.c (revision 1085)
@@ -0,0 +1,57 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <string.h>
+#include "common.c"
+
+int main(int argc,char *argv[])
+{
+ int res;
+ int c;
+ int h;
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ /* mounting 2nd msdos partition on /TEMP */
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ //sys_end();
+ return -1;
+ }
+
+ /*
+ *
+ */
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+ if (h>=0) {
+ char buffer[128];
+ int len;
+ cprintf("OPENED!\n");
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+ } else
+ cprintf("FAILED!\n");
+
+ cprintf("Press [x] to exit\n");
+
+ while ((c = keyb_getchar()) != 'x');
+
+ bdev_dump_status();
+
+ sys_end();
+ return 0;
+}
Index: branches/pj/oldexamples/fs/tree2.c
===================================================================
--- branches/pj/oldexamples/fs/tree2.c (nonexistent)
+++ branches/pj/oldexamples/fs/tree2.c (revision 1085)
@@ -0,0 +1,275 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#define NOSHOW
+#undef NOSHOW
+
+#define sem_signal sem_post
+
+int noscroll=0;
+sem_t console;
+
+#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
+//#define MWCET 1000l
+//#define MPERIOD (MWCET*(MPROC+10))
+
+TASK viewdir(void *prof);
+sem_t actmutex,actsync;
+char *globpathname;
+PID globpid;
+int counter=0,actcounter=0;
+
+void activate_task(int prof, char *pathname)
+{
+ char tname[32];
+ NRT_TASK_MODEL m;
+ PID pid;
+
+REPEAT:
+ sem_wait(&actmutex);
+
+ if (actcounter>=MPROC) {
+ sem_signal(&actmutex);
+ task_delay(10000);
+ goto REPEAT;
+ }
+
+ globpathname=pathname;
+ counter++;
+ sprintf(tname,"tsk%i",counter);
+
+ /*
+ printd("Û");
+ sem_wait(&console);
+ printd("Ü");
+ cprintf("%03i has called for ##%s##\n",prof,pathname);
+ sem_signal(&console);
+ */
+
+ nrt_task_default_model(m);
+ //soft_task_def_met(m,MWCET);
+ //soft_task_def_wcet(m,MWCET);
+ //soft_task_def_periodic(m);
+ nrt_task_def_arg(m,(void*)counter);
+ //soft_task_def_period(m,MPERIOD);
+
+ globpid=pid=task_create(tname,viewdir,&m,NULL);
+ if (pid==-1) {
+ sem_wait(&console);
+ cprintf("can't create '%s'\n",tname);
+ perror("can't create task");
+ sem_signal(&console);
+ sys_end();
+ return;
+ }
+ task_activate(pid);
+ sem_wait(&actsync);
+ actcounter++;
+
+ /*
+ printd("Û");
+ sem_wait(&console);
+ printd("Ü");
+ if (noscroll) place(0,9);
+ cprintf("task running: %5i/%5i --- task started: %5i\n",
+ actcounter,MAX_PROC,counter);
+ sem_signal(&console);
+ */
+
+ sem_signal(&actmutex);
+}
+
+/*
+ *
+ */
+
+int filecounter=0;
+
+TASK viewdir(void *pointer)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ char pathname[1024];
+ PID mypid;
+ int prof=(int)pointer;
+
+ strcpy(pathname,globpathname);
+ mypid=globpid;
+ sem_signal(&actsync);
+
+ //sem_wait(&console);
+ //cprintf("%03i on <%s>\n",prof,pathname);
+ //sem_signal(&console);
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ sem_wait(&console);
+ cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ goto END;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ sem_wait(&console);
+#ifndef NOSHOW
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ //cprintf("%03i(0_%03i) %s\n",prof,(int)mypid,pathname);
+ cprintf("t%03i %s\n",prof,pathname);
+#endif
+ filecounter++;
+ sem_signal(&console);
+
+ //if (*den->d_name=='.') {
+ // sem_wait(console,BLOCK);
+ // cprintf("%03i HAS FOUND <%s>\n",prof,den->d_name);
+ // sem_signal(console);
+ //}
+
+ if (!strcmp(den->d_name,".")) {
+ //sem_wait(console,BLOCK);
+ //cprintf("%03i skip for .\n",prof);
+ //sem_signal(console);
+ goto SKIP;
+ }
+ if (!strcmp(den->d_name,"..")) {
+ //sem_wait(console,BLOCK);
+ //cprintf("%03i skip for ..\n",prof);
+ //sem_signal(console);
+ goto SKIP;
+ }
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ sem_wait(&console);
+ cprintf("t%03i can't stat %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ closedir(d);
+ goto END;
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ sem_wait(&console);
+ //if (den->d_name[0]=='.')
+ // cprintf("%03i called for <%s>\n",prof,den->d_name);
+ sem_signal(&console);
+ activate_task(prof,pathname);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+
+END:
+ sem_wait(&actmutex);
+ actcounter--;
+ sem_signal(&actmutex);
+
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ extern void dump_sem_table(void);
+ TIME stime,etime;
+ // int res;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+ */
+
+ /* mounting 2nd msdos partition on /TEMP */
+ /*
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ return -1;
+ }
+ */
+
+ /* clear screen */
+ //clear();
+
+ showmessage("This test show all filenames of a directory of an hardisk\n"
+ "recursively using a soft task for every directory.\n");
+
+ stime=sys_gettime(NULL);
+
+ sem_init(&console,0,1);
+ sem_init(&actmutex,0,1);
+ sem_init(&actsync,0,0);
+
+ //dump_sem_table();
+
+ //keyb_getchar();
+
+ activate_task(-1,"/TEMP");
+
+ for(;;) {
+ sem_wait(&actmutex);
+ if (actcounter==0) break;
+ sem_signal(&actmutex);
+ }
+
+ etime=sys_gettime(NULL);
+
+ cprintf("\nfiles: %i\n",filecounter);
+ cprintf("time : %li\n",etime-stime);
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/hello.c
===================================================================
--- branches/pj/oldexamples/fs/hello.c (nonexistent)
+++ branches/pj/oldexamples/fs/hello.c (revision 1085)
@@ -0,0 +1,13 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nHello, world!\n\n");
+ return 0;
+}
Index: branches/pj/oldexamples/fs/testu.c
===================================================================
--- branches/pj/oldexamples/fs/testu.c (nonexistent)
+++ branches/pj/oldexamples/fs/testu.c (revision 1085)
@@ -0,0 +1,47 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW1.TXT"
+
+//#define FILENAME "/TEMP/CIR2"
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+
+ showmessage("Try to unlink (ie. delete) a file.\n");
+
+ cprintf("UNLINKING %s\n",FILENAME);
+ res=unlink(FILENAME);
+ if (res!=0) {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ } else cprintf("OK!\n");
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/testw0.c
===================================================================
--- branches/pj/oldexamples/fs/testw0.c (nonexistent)
+++ branches/pj/oldexamples/fs/testw0.c (revision 1085)
@@ -0,0 +1,54 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW0.TXT"
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+ // int c;
+ int h;
+
+ showmessage("Try to create and truncate a file.\n");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
+ if (h!=-1) {
+ cprintf("CLOSING %s\n",FILENAME);
+ res=close(h);
+ if (res!=0) {
+ cprintf("CLOSE FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+ } else {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/testw1.c
===================================================================
--- branches/pj/oldexamples/fs/testw1.c (nonexistent)
+++ branches/pj/oldexamples/fs/testw1.c (revision 1085)
@@ -0,0 +1,71 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW1.TXT"
+
+int scrivi(int h,char *buffer,int len)
+{
+ int res;
+ cprintf("WRITING...\n");
+ res=write(h,buffer,len);
+ cprintf("WRITTEN %i bytes\n",res);
+ if (res>0) {
+ buffer[res]='\0';
+ cprintf("(%s)\n",buffer);
+ } else cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ return res;
+}
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+ int h;
+
+ showmessage("Try to create and overwriting a file.\n");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
+
+ if (h>=0) {
+ cprintf("OPENED fd=%i!\n",h);
+
+ scrivi(h,"ABC ",3);
+
+ scrivi(h,"abcdefghilmnopqrstuvz ",21);
+
+ res=close(h);
+ if (res!=0) {
+ cprintf("CLOSE FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+ } else {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+
+ waitend();
+
+ return 0;
+}
Index: branches/pj/oldexamples/fs/common.c
===================================================================
--- branches/pj/oldexamples/fs/common.c (nonexistent)
+++ branches/pj/oldexamples/fs/common.c (revision 1085)
@@ -0,0 +1,136 @@
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* -- */
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+__dev_t root_device;
+__dev_t temp_device;
+
+int choose_root_callback(__dev_t dev,__uint8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+/* -- */
+
+//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+/* -- */
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ return 0;
+}
+
+/* -- */
+
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ //dump_sem_table();
+ //dump_nop_table();
+ //sys_status(SCHED_STATUS);
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+/* -- */
+
+void showmessage(char *s)
+{
+ cputs(s);
+ cprintf("Press [x] to begin...");
+ while (keyb_getchar()!='x');
+ cprintf("\n");
+}
+
+void waitend(void)
+{
+ int c;
+ cprintf("Press [x] to exit...");
+ while ((c=keyb_getchar())!='x');
+ cprintf("\n");
+}
Index: branches/pj/oldexamples/fs/makefile
===================================================================
--- branches/pj/oldexamples/fs/makefile (nonexistent)
+++ branches/pj/oldexamples/fs/makefile (revision 1085)
@@ -0,0 +1,45 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS=hello
+PROGS+=test0 test1
+PROGS+=testw0 testw1
+PROGS+=tree1 tree2
+PROGS+=testu
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+#
+#
+#
+
+hello:
+ make -f $(SUBMAKE) APP=hello INIT=initfs.o OTHEROBJS=common.o
+
+test0:
+ make -f $(SUBMAKE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
+
+test1:
+ make -f $(SUBMAKE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
+
+testu:
+ make -f $(SUBMAKE) APP=testu INIT=initfs.o OTHEROBJS=common.o
+
+testw0:
+ make -f $(SUBMAKE) APP=testw0 INIT=initfs.o OTHEROBJS=common.o
+
+testw1:
+ make -f $(SUBMAKE) APP=testw1 INIT=initfs.o OTHEROBJS=common.o
+
+tree1:
+ make -f $(SUBMAKE) APP=tree1 INIT=initfs.o OTHEROBJS=common.o
+
+tree2:
+ make -f $(SUBMAKE) APP=tree2 INIT=initfs.o OTHEROBJS=common.o
Index: branches/pj/oldexamples/fs/common.h
===================================================================
--- branches/pj/oldexamples/fs/common.h (nonexistent)
+++ branches/pj/oldexamples/fs/common.h (revision 1085)
@@ -0,0 +1,15 @@
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include <sys/types.h>
+
+extern __dev_t root_device;
+extern __dev_t temp_device;
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs);
+
+void showmessage(char *s);
+void waitend(void);
+
+#endif
Index: branches/pj/oldexamples/mpeg/mplay.c
===================================================================
--- branches/pj/oldexamples/mpeg/mplay.c (nonexistent)
+++ branches/pj/oldexamples/mpeg/mplay.c (revision 1085)
@@ -0,0 +1,516 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:48 $
+ */
+
+#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+//#include <hartik.h>
+#include <drivers/keyb.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+//#include <xdos.h>
+#include <drivers/glib.h>
+
+#include "mpeg/video.h"
+/*#include "proto.h"*/
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+
+
+
+
+
+#include <drivers/keyb.h>
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ grx_close();
+ cprintf("CTRL-C pressed!\n");
+ grx_modeinfo();
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ //struct mount_opts opts;
+
+ //memset(&opts,0,sizeof(struct mount_opts));
+ //opts.flags=MOUNT_FLAG_RW;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ return 0;
+}
+
+
+
+
+
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TIME ttt;
+
+DWORD n;
+
+///* #define GPHBDIM 4097152 */
+//#define GPHBDIM 1000000
+
+//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
+//BYTE *nextphbyte = gphb;
+
+struct streamdescr {
+ FILE *f;
+ ImageDesc *i;
+ int x1, y1;
+} sd[10];
+
+#define SCREENX 800
+#define SCREENY 600
+
+void txtreset(void *dummy)
+{
+ grx_close();
+ grx_modeinfo();
+ /* cprintf("Total frames: %ld\n", i);
+ cprintf("Total time: %lu\n", t);*/
+ //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
+ /* cprintf("Max frame time: %lu\n", mft);*/
+ /*
+ sys_status(READY_RT_STATUS | READY_NRT_STATUS | BLOCKED_STATUS |
+ IDLE_STATUS | SLEEP_STATUS | EXEC_STATUS);
+ */
+}
+
+#define MAINSLEEP 20000
+
+void drawload(TIME l)
+{
+ #define LLPWINSIZE 20
+ int actl;
+// struct load l;
+ #define LOADX 500
+ #define LOADY 300
+ #define LOADYDIM 50
+ #define LOADXDIM 100
+ static int th = 0;
+ static int x = 0;
+ static int hy[LLPWINSIZE];
+ static int somma = 0;
+ int i;
+
+/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
+
+// load_actual(&l);
+// actl = (LOADYDIM * l.actual) / l.rif + 1;
+// {
+// char str[80];
+// sprintf(str,"%d",actl);
+// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
+// grx_text(" ", 100, 400, 100, 0);
+// grx_text(str, 100, 400, 100,0);
+// }
+/* LowPass Filter */
+
+
+ actl=((long)l*LOADYDIM)/MAINSLEEP+1;
+
+ somma += actl - hy[th];
+ hy[th] = actl;
+ th = (th + 1) % LLPWINSIZE;
+ actl = somma / LLPWINSIZE;
+ grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
+ if (actl > LOADYDIM) actl = LOADYDIM;
+ grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
+
+ x = (x + 1) % LOADXDIM;
+
+}
+
+
+
+TASK play(void *arg)
+{
+ int i=(int)arg;
+ int loop = TRUE;
+ BYTE *pixels;
+ int moreframes = TRUE;
+ FILE *mpeg = sd[i].f;
+ ImageDesc *img = sd[i].i;
+ int x1, y1, x2, y2;
+
+ /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img->PictureRate, img->BitRate);*/
+
+ pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
+ x1 = sd[i].x1;
+ y1 = sd[i].y1;
+ x2 = x1 + img->Width-1;
+ y2 = y1 + img->Height-1;
+ while (loop) { /* play the whole movie forever */
+ loop = 1;
+ n = 0;
+ ttt = sys_gettime(NULL);
+ while (moreframes) {
+ //cprintf("°");
+ moreframes = GetMPEGFrame (img, pixels);
+ grx_putimage(x1, y1, x2, y2, pixels);
+ n++;
+ task_endcycle();
+ }
+ ttt = sys_gettime(NULL) - ttt;
+ RewindMPEG (mpeg, img);
+ SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ moreframes = TRUE;
+ }
+
+ return 0;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ // SYS_PARMS sp = BASE_SYS;
+ KEY_EVT k;
+ // MODEL m = BASE_MODEL;
+ PID pid;
+
+ // DOS_FILE *Infile;
+// BYTE *mpegbuff[10], *p;
+// WORD res;
+// DWORD cnt[10];
+
+
+TIME sum;
+
+ SOFT_TASK_MODEL model;
+
+ FILE *mpeg;
+ ImageDesc img[10];
+ int full_color = FALSE;
+
+ int mode;
+ int esc;
+ int i;
+ int actx = 10, acty = 10;
+ ColormapEntry *cp;
+
+ //cprintf("file '%s'\n",argv[1]);
+
+ if (argc < 2) {
+ fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
+ sys_abort(301);
+ }
+
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ Infile = DOS_fopen(argv[i + 1], "r");
+ if (!Infile) {
+ cprintf("%s not found!!!\n", argv[i + 1]);
+ sys_abort(300);
+ }
+ cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
+
+ mpegbuff[i] = nextphbyte;
+ p = mpegbuff[i]; cnt[i] = 0;
+ res = 0x1000;
+ while (res > 0) {
+ res = DOS_fread(p, 0x1000, 1, Infile);
+ cnt[i] += res;
+ p += res;
+ }
+ p += res;
+ nextphbyte = p;
+ }
+ */
+
+ /* OK, Now we can start the system!!! */
+ //sys_init(&sp);
+ //keyb_init(SOFT, 100);
+ // keyb_init(NULL);
+ // k.flag = CNTR_BIT;
+ // k.scan = KEY_C;
+ // k.ascii = 'c';
+ //keyb_excset(k,endfun);
+
+ //vfs_init();
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
+ }
+ */
+
+
+
+
+
+
+ /* Init the graph... */
+ if (grx_init() == -1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+
+ mode = grx_getmode(SCREENX, SCREENY, 8);
+ cprintf("Mode num: %x\n", mode);
+ grx_cardinfo();
+ cprintf("[hit enter to continue]\n");
+ esc = FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+
+ if (mode == -1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+
+ //sys_atexit(txtreset,NULL,AFTER_EXIT);
+
+
+ //cprintf("Û0Û");
+
+ for (i = 0; i < argc - 1; i++) {
+ mpeg = fopen(argv[i + 1], "r");
+
+ if (!mpeg) {
+ perror (argv[1]);
+ sys_abort(301);
+ }
+
+
+ setvbuf(mpeg,NULL,_IOFBF,BUFSIZ*100);
+
+
+ //cprintf("Û0.5Û");
+
+ /* !!! */
+ img[i].vid_stream=NULL;
+ img[i].Colormap=NULL;
+
+ if (!OpenMPEG(mpeg, &(img[i]))) {
+ fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
+ sys_abort(301);
+ }
+
+
+ //cprintf("Û1Û");
+
+
+
+ SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
+ //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
+
+
+ /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
+
+ /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img[i].PictureRate, img[i].BitRate); */
+
+ //cprintf("Û2Û");
+
+ if (i == 0) {
+ cp = img[i].Colormap;
+
+ if (!full_color) {
+ int ii;
+
+ for (ii = 0; ii < img[i].ColormapSize; ii++) {
+
+
+ grx_setcolor (ii, img[i].Colormap[ii].red / 4,
+ img[i].Colormap[ii].green / 4,
+ img[i].Colormap[ii].blue / 4);
+
+
+ }
+
+ /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
+ /* grx_setpalette(0, 255, img.Colormap);*/
+ }
+ }
+ if (actx + img[i].Width > SCREENX) {
+ actx = 10;
+ acty += 200;
+ }
+ sd[i].x1 = actx;
+ sd[i].y1 = acty;
+ sd[i].f = mpeg;
+ sd[i].i = &(img[i]);
+
+ //cprintf("Û3Û");
+
+ soft_task_default_model(model);
+ ////soft_task_def_system(model);
+ //soft_task_def_met(model,9000);
+ //soft_task_def_wcet(model,9000);
+ //soft_task_def_period(model,50000);
+
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,15000);
+ soft_task_def_period(model,40000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)i);
+ soft_task_def_ctrl_jet(model);
+
+ //task_def_arg(m, i);
+ //task_def_wcet(m, 9000);
+ pid = task_create("video", play, &model, NULL);
+ if (pid == -1) {
+ cprintf(" task --> Not Guaranteed!!!\n");
+ sys_abort(20000);
+ }
+ task_activate(pid);
+
+ //cprintf("Û4Û");
+
+ actx += img[i].Width + 10;
+ }
+
+ /* play(0);*/
+ esc = FALSE;
+ //jet_delstat(pid);
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
+ task_delay(MAINSLEEP);
+ //jet_getstat(pid,&sum,NULL,NULL,NULL);
+ //jet_delstat(pid);
+ //drawload(sum);
+ }
+
+ sys_abort(59000);
+
+ return 0;
+}
Index: branches/pj/oldexamples/mpeg/mplay2.c
===================================================================
--- branches/pj/oldexamples/mpeg/mplay2.c (nonexistent)
+++ branches/pj/oldexamples/mpeg/mplay2.c (revision 1085)
@@ -0,0 +1,591 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay2.c,v 1.1.1.1 2002-09-02 09:37:48 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:48 $
+ */
+
+#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+//#include <hartik.h>
+#include <drivers/keyb.h>
+
+
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+//#include <xdos.h>
+#include <drivers/glib.h>
+
+#include "mpeg/video.h"
+/*#include "proto.h"*/
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+
+
+
+
+
+
+
+//#define NOSHOW 1
+
+
+
+
+#include <drivers/keyb.h>
+
+
+int mustdied=0;
+
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ mustdied=1;
+#ifndef NOSHOW
+ grx_close();
+#endif
+ cprintf("CTRL-C pressed!\n");
+ //sys_status(SCHED_STATUS);
+#ifndef NOSHOW
+ grx_modeinfo();
+#endif
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ int id;
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_trace_class(TRC_CLASS_USER);
+ trc_assign_class_to_queue(TRC_CLASS_USER,id);
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+dev_t temp_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ } else
+ cprintf("mounted /TEMP rw\n");
+
+ }
+
+ libc_initialize();
+
+ TRC_init_phase2();
+
+ return 0;
+}
+
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TIME ttt;
+
+DWORD n[10];
+
+///* #define GPHBDIM 4097152 */
+//#define GPHBDIM 1000000
+
+//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
+//BYTE *nextphbyte = gphb;
+
+struct streamdescr {
+ FILE *f;
+ ImageDesc *i;
+ int x1, y1;
+} sd[10];
+
+#define SCREENX 800
+#define SCREENY 600
+
+void txtreset(void *dummy)
+{
+#ifndef NOSHOW
+ grx_close();
+ grx_modeinfo();
+ /* cprintf("Total frames: %ld\n", i);
+ cprintf("Total time: %lu\n", t);*/
+ //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
+ /* cprintf("Max frame time: %lu\n", mft);*/
+ /*
+ sys_status(READY_RT_STATUS | READY_NRT_STATUS | BLOCKED_STATUS |
+ IDLE_STATUS | SLEEP_STATUS | EXEC_STATUS);
+ */
+#endif
+}
+
+#define MAINSLEEP 20000
+
+void drawload(TIME l)
+{
+ #define LLPWINSIZE 20
+ int actl;
+// struct load l;
+ #define LOADX 500
+ #define LOADY 300
+ #define LOADYDIM 50
+ #define LOADXDIM 100
+ static int th = 0;
+ static int x = 0;
+ static int hy[LLPWINSIZE];
+ static int somma = 0;
+ int i;
+
+/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
+
+// load_actual(&l);
+// actl = (LOADYDIM * l.actual) / l.rif + 1;
+// {
+// char str[80];
+// sprintf(str,"%d",actl);
+// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
+// grx_text(" ", 100, 400, 100, 0);
+// grx_text(str, 100, 400, 100,0);
+// }
+/* LowPass Filter */
+
+
+ actl=((long)l*LOADYDIM)/MAINSLEEP+1;
+
+ somma += actl - hy[th];
+ hy[th] = actl;
+ th = (th + 1) % LLPWINSIZE;
+ actl = somma / LLPWINSIZE;
+#ifndef NOSHOW
+ grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
+ if (actl > LOADYDIM) actl = LOADYDIM;
+ grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
+#endif
+ x = (x + 1) % LOADXDIM;
+
+}
+
+
+
+TASK play(void *arg)
+{
+ int i=(int)arg;
+ int loop = TRUE;
+ BYTE *pixels;
+ int moreframes = TRUE;
+ FILE *mpeg = sd[i].f;
+ ImageDesc *img = sd[i].i;
+ int x1, y1, x2, y2;
+
+ /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img->PictureRate, img->BitRate);*/
+
+ pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
+ x1 = sd[i].x1;
+ y1 = sd[i].y1;
+ x2 = x1 + img->Width-1;
+ y2 = y1 + img->Height-1;
+ while (loop) { /* play the whole movie forever */
+ loop = 0;
+ n[i] = 0;
+ ttt = sys_gettime(NULL);
+ while (moreframes && n[i]<250) {
+
+ if (mustdied) break;
+
+#ifdef NOSHOW
+ cprintf("%c",'°'+i);
+#endif
+
+ moreframes = GetMPEGFrame (img, pixels);
+#ifndef NOSHOW
+ grx_putimage(x1, y1, x2, y2, pixels);
+#endif
+ n[i]++;
+ task_endcycle();
+ }
+ ttt = sys_gettime(NULL) - ttt;
+ if (!loop) break;
+ RewindMPEG (mpeg, img);
+ SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ moreframes = TRUE;
+ }
+
+ return 0;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ // SYS_PARMS sp = BASE_SYS;
+ KEY_EVT k;
+ // MODEL m = BASE_MODEL;
+ PID pid;
+
+ // DOS_FILE *Infile;
+// BYTE *mpegbuff[10], *p;
+// WORD res;
+// DWORD cnt[10];
+
+
+TIME sum;
+
+ SOFT_TASK_MODEL model;
+
+ FILE *mpeg;
+ ImageDesc img[10];
+ int full_color = FALSE;
+
+ int mode;
+ int esc;
+ int i;
+ int actx = 10, acty = 10;
+ ColormapEntry *cp;
+
+ //cprintf("file '%s'\n",argv[1]);
+
+ if (argc < 2) {
+ fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
+ sys_abort(301);
+ }
+
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ Infile = DOS_fopen(argv[i + 1], "r");
+ if (!Infile) {
+ cprintf("%s not found!!!\n", argv[i + 1]);
+ sys_abort(300);
+ }
+ cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
+
+ mpegbuff[i] = nextphbyte;
+ p = mpegbuff[i]; cnt[i] = 0;
+ res = 0x1000;
+ while (res > 0) {
+ res = DOS_fread(p, 0x1000, 1, Infile);
+ cnt[i] += res;
+ p += res;
+ }
+ p += res;
+ nextphbyte = p;
+ }
+ */
+
+ /* OK, Now we can start the system!!! */
+ //sys_init(&sp);
+ //keyb_init(SOFT, 100);
+ // keyb_init(NULL);
+ // k.flag = CNTR_BIT;
+ // k.scan = KEY_C;
+ // k.ascii = 'c';
+ //keyb_excset(k,endfun);
+
+ //vfs_init();
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
+ }
+ */
+
+
+
+
+
+
+ /* Init the graph... */
+#ifndef NOSHOW
+
+ if (grx_init() == -1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+
+ mode = grx_getmode(SCREENX, SCREENY, 8);
+ cprintf("Mode num: %x\n", mode);
+ grx_cardinfo();
+#endif
+
+ cprintf("[hit enter to continue]\n");
+ esc = FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+
+ if (mode == -1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+
+#ifndef NOSHOW
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+ //sys_atexit(txtreset,NULL,AFTER_EXIT);
+
+
+ //cprintf("Û0Û");
+
+ for (i = 0; i < argc - 1; i++) {
+ mpeg = fopen(argv[i + 1], "r");
+
+ if (!mpeg) {
+ perror (argv[1]);
+ sys_abort(301);
+ }
+
+ //cprintf("Û0.5Û");
+
+ /* !!! */
+ img[i].vid_stream=NULL;
+ img[i].Colormap=NULL;
+
+ if (!OpenMPEG(mpeg, &(img[i]))) {
+ fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
+ sys_abort(301);
+ }
+
+
+ //cprintf("Û1Û");
+
+
+
+ SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
+ //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
+
+
+ /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
+
+ /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img[i].PictureRate, img[i].BitRate); */
+
+ //cprintf("Û2Û");
+
+ if (i == 0) {
+ cp = img[i].Colormap;
+
+ if (!full_color) {
+ int ii;
+
+ for (ii = 0; ii < img[i].ColormapSize; ii++) {
+
+#ifndef NOSHOW
+
+ grx_setcolor (ii, img[i].Colormap[ii].red / 4,
+ img[i].Colormap[ii].green / 4,
+ img[i].Colormap[ii].blue / 4);
+
+#endif
+
+ }
+
+ /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
+ /* grx_setpalette(0, 255, img.Colormap);*/
+ }
+ }
+ if (actx + img[i].Width > SCREENX) {
+ actx = 10;
+ acty += 200;
+ }
+ sd[i].x1 = actx;
+ sd[i].y1 = acty;
+ sd[i].f = mpeg;
+ sd[i].i = &(img[i]);
+
+ //cprintf("Û3Û");
+
+ soft_task_default_model(model);
+ ////soft_task_def_system(model);
+ //soft_task_def_met(model,9000);
+ //soft_task_def_wcet(model,9000);
+ //soft_task_def_period(model,50000);
+
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,5000);
+ soft_task_def_period(model,40000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)i);
+ soft_task_def_ctrl_jet(model);
+
+ //task_def_arg(m, i);
+ //task_def_wcet(m, 9000);
+ pid = task_create("Shower", play, &model, NULL);
+ if (pid == -1) {
+ cprintf(" task --> Not Guaranteed!!!\n");
+ sys_abort(20000);
+ }
+ task_activate(pid);
+
+ //cprintf("Û4Û");
+
+ actx += img[i].Width + 10;
+ }
+
+ /* play(0);*/
+ esc = FALSE;
+ //jet_delstat(pid);
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
+ task_delay(MAINSLEEP);
+ //jet_getstat(pid,&sum,NULL,NULL,NULL);
+ //jet_delstat(pid);
+ //drawload(sum);
+ }
+
+ sys_abort(59000);
+
+ return 0;
+}
Index: branches/pj/oldexamples/mpeg/common.c
===================================================================
--- branches/pj/oldexamples/mpeg/common.c (nonexistent)
+++ branches/pj/oldexamples/mpeg/common.c (revision 1085)
@@ -0,0 +1,74 @@
+#include <drivers/keyb.h>
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ grx_close();
+ cprintf("CTRL-C pressed!\n");
+ grx_modeinfo();
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ //struct mount_opts opts;
+
+ //memset(&opts,0,sizeof(struct mount_opts));
+ //opts.flags=MOUNT_FLAG_RW;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ return 0;
+}
+
Index: branches/pj/oldexamples/mpeg/mpg123.c
===================================================================
--- branches/pj/oldexamples/mpeg/mpg123.c (nonexistent)
+++ branches/pj/oldexamples/mpeg/mpg123.c (revision 1085)
@@ -0,0 +1,219 @@
+
+#include "mpg123/mpg123.h"
+#include <stdlib.h>
+
+/* stub */
+FILE *http_open (char *url)
+{
+ return NULL;
+}
+
+
+
+static long rates[3][3] = {
+ { 32000,44100,48000 } ,
+ { 16000,22050,24000 } ,
+ { 8000,11025,12000 }
+};
+
+int supported_rates = 0;
+
+int outmode = DECODE_AUDIO;
+
+char *listname = NULL;
+long outscale = 32768;
+int checkrange = FALSE;
+int tryresync = TRUE;
+int quiet = FALSE;
+int verbose = 0;
+int doublespeed= 0;
+int halfspeed = 0;
+int shuffle = 0;
+int change_always = 1;
+int force_8bit = 0;
+int force_frequency = -1;
+long numframes = -1;
+long startFrame= 0;
+int usebuffer = 0;
+int frontend_type = 0;
+int remote = 0;
+int buffer_fd[2];
+int buffer_pid;
+
+
+static int intflag = FALSE;
+static int remflag = FALSE;
+
+
+static char remote_buffer[1024];
+static struct frame fr;
+static struct audio_info_struct ai;
+txfermem *buffermem;
+#define FRAMEBUFUNIT (18 * 64 * 4)
+
+void init_output(void)
+{
+ static int init_done = FALSE;
+
+ if (init_done)
+ return;
+ init_done = TRUE;
+
+ if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2))) {
+ perror ("malloc()");
+ l1_exit (1);
+
+ }
+
+ if(outmode==DECODE_AUDIO) {
+ //if(audio_open(&ai) < 0) {
+ // perror("audio");
+ // exit(1);
+ // }
+ /* audio_set_rate (&ai); should already be done in audio_open() [OF] */
+ }
+}
+
+static void reset_audio_samplerate(void)
+{
+
+ //if (outmode == DECODE_AUDIO) {
+ /* audio_reset_parameters(&ai); */
+ /* close and re-open in order to flush
+ * the device's internal buffer before
+ * changing the sample rate. [OF]
+ */
+ //audio_close (&ai);
+ //if (audio_open(&ai) < 0) {
+ // perror("audio");
+ // exit(1);
+ // }
+ // }
+}
+
+void play_frame(int init,struct frame *fr)
+{
+ int clip;
+
+ if((fr->header_change && change_always) || init) {
+ int reset_audio = 0;
+
+ if(remote)
+ print_rheader(fr);
+
+ if (!quiet && init) {
+ if (verbose)
+ print_header(fr);
+ else
+ print_header_compact(fr);
+ }
+
+ if(force_frequency < 0) {
+ if(ai.rate != freqs[fr->sampling_frequency]>>(fr->down_sample)) {
+ ai.rate = freqs[fr->sampling_frequency]>>(fr->down_sample);
+ reset_audio = 1;
+ }
+ }
+ else if(ai.rate != force_frequency) {
+ ai.rate = force_frequency;
+ reset_audio = 1;
+ }
+
+ init_output();
+
+ if(reset_audio) {
+ reset_audio_samplerate();
+ if (intflag)
+ return;
+ }
+ }
+
+ if (fr->error_protection) {
+ getbits(16); /* crc */
+ }
+
+ clip = (fr->do_layer)(fr,outmode,&ai);
+
+ /*
+ if(clip > 0 && checkrange)
+ fprintf(stderr,"%d samples clipped\n", clip);
+ */
+}
+
+void audio_info_struct_init(struct audio_info_struct *ai)
+{
+ ai->rate = -1;
+ ai->gain = -1;
+ ai->output = -1;
+ ai->device = NULL;
+ ai->channels = -1;
+ ai->format = -1;
+}
+
+int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int n)
+{
+ return 0;
+}
+
+
+int main(int argc,char *argv[])
+{
+ static char *fname="/MOSSE.MP3";
+ int result;
+ unsigned long frameNum = 0;
+ //struct timeval start_time, now;
+ unsigned long secdiff;
+ int init;
+
+
+ quiet=0;
+ verbose=1;
+
+ // DECODE_STDOUT stampa to 1
+ // DECODE_AUDIO chiama la audio_play_samples
+ // DECODE_BUFFER scrive su buffer_fd[1]
+ outmode = DECODE_AUDIO;
+
+ audio_info_struct_init(&ai);
+
+ fr.single = -1; /* both channels */
+ fr.synth = synth_1to1;
+ fr.down_sample = 0;
+
+ make_decode_tables(outscale);
+ init_layer2();
+ init_layer3(fr.down_sample);
+
+ open_stream(fname,-1);
+
+ //gettimeofday (&start_time, NULL);
+ read_frame_init();
+
+ init = 1;
+ for(frameNum=0;read_frame(&fr) && numframes && !intflag;frameNum++) {
+ if(frameNum < startFrame || (doublespeed && (frameNum % doublespeed))) {
+ if(fr.lay == 3)
+ set_pointer(512);
+ continue;
+ }
+ numframes--;
+ play_frame(init,&fr);
+ init = 0;
+ if (!(frameNum & 0xf))
+ fprintf(stderr, "\r{%4lu} ",frameNum);
+ }
+
+ close_stream();
+
+ {
+ /* This formula seems to work at least for
+ * MPEG 1.0/2.0 layer 3 streams.
+ */
+ int sfd = freqs[fr.sampling_frequency] * (fr.lsf + 1);
+ int secs = (frameNum * (fr.lay==1 ? 384 : 1152) + sfd / 2) / sfd;
+ fprintf(stderr,"[%d:%02d] Decoding of %s finished.\n", secs / 60,
+ secs % 60, fname);
+ }
+
+}
+
Index: branches/pj/oldexamples/mpeg/makefile
===================================================================
--- branches/pj/oldexamples/mpeg/makefile (nonexistent)
+++ branches/pj/oldexamples/mpeg/makefile (revision 1085)
@@ -0,0 +1,42 @@
+#
+#
+#
+# TO REMAKE BETTER
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+include $(BASE)/config/libdep.mk
+
+.PHONY: test all install depend clean cleanall
+
+C_INC+= -I$(BASE)/ports
+LINK_LIB+= -lmpeg -lmp3
+LINK_DEP+= $(LIB_PATH)/libmpeg.a $(LIB_PATH)/libmp3.a
+
+test:: mplay mplay2 mpg123
+
+clean::
+ rm -f *.o
+ rm -f mplay
+ rm -f mplay2
+ rm -f mpg123
+
+mplay:mplay.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay
+
+mplay2:mplay2.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay2.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay2
+
+mpg123:mpg123.o common.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) \
+ mpg123.o common.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mpg123
Index: branches/pj/oldexamples/block/idetest0.c
===================================================================
--- branches/pj/oldexamples/block/idetest0.c (nonexistent)
+++ branches/pj/oldexamples/block/idetest0.c (revision 1085)
@@ -0,0 +1,15 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <fs/bdev.h>
+
+#include "common.h"
+
+int main(int argc,char *argv[])
+{
+ showmessage("Have ide devices been found?\n");
+ return 0;
+}
Index: branches/pj/oldexamples/block/idetest1.c
===================================================================
--- branches/pj/oldexamples/block/idetest1.c (nonexistent)
+++ branches/pj/oldexamples/block/idetest1.c (revision 1085)
@@ -0,0 +1,20 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <fs/bdev.h>
+
+#include "common.h"
+
+int main(int argc,char *argv[])
+{
+
+ showmessage("This test try to identify the partions of all hard disks\n");
+
+ bdev_dump_names();
+
+ waitend();
+ return 0;
+}
Index: branches/pj/oldexamples/block/idetest2.c
===================================================================
--- branches/pj/oldexamples/block/idetest2.c (nonexistent)
+++ branches/pj/oldexamples/block/idetest2.c (revision 1085)
@@ -0,0 +1,77 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <fs/bdevinit.h>
+#include <fs/bdev.h>
+
+#include <string.h>
+
+#include "common.h"
+
+#define DISKDEVICE "ide/hda1"
+
+__uint8_t buffer[2048] __attribute__ ((aligned (4)));
+__dev_t dev;
+
+extern char *ide_error_msg[];
+
+int main(int argc,char *argv[])
+{
+ __blkcnt_t blk;
+ int res;
+ int c;
+
+ showmessage("This test try to read some blocks from first hard disk\n");
+
+ dev=bdev_find_byname(DISKDEVICE);
+ if (dev<0) {
+ cprintf("Can't find device to operate with\n");
+ return -1;
+ }
+ cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
+
+ blk=0;
+ for (;;) {
+ cprintf("Commands: x-exit r-read n-next block p-prev block\n");
+ c = keyb_getchar();
+ switch(c) {
+ case 'x':
+ return 0;
+
+ case 'n':
+ blk++;
+ cprintf("Block %li\n",(long)blk);
+ break;
+
+ case 'p':
+ if (blk>=0) blk--;
+ cprintf("Block %li\n",(long)blk);
+ break;
+
+ case 'r':
+ cprintf("Reading block %li...\n",(long)blk);
+ memset(buffer,0xff,sizeof(buffer));
+ res=bdev_read(dev,blk,buffer);
+ cprintf("Result %i\n",res);
+ //cprintf("Soft reset done %i\n",ide[0].errors);
+ if (res!=0) {
+ cprintf(" %s\n",(char*)ide_error_msg[-res]);
+ }
+ debug_dump_buffer(buffer,64);
+ break;
+
+ default:
+ cprintf("Invalid command!\n");
+ break;
+ }
+ cprintf("\n");
+ }
+
+ return 0;
+}
Index: branches/pj/oldexamples/block/idelin.c
===================================================================
--- branches/pj/oldexamples/block/idelin.c (nonexistent)
+++ branches/pj/oldexamples/block/idelin.c (revision 1085)
@@ -0,0 +1,71 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/bdev.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+#define DISKDEVICE "ide/hda"
+
+#define TEST_MB 16
+
+#define NUMBLOCK (TEST_MB*1024l*1024l/512l)
+
+__dev_t dev;
+
+__uint8_t buffer[2048];
+
+int main(int argc,char *argv[])
+{
+ __blkcnt_t blk;
+ int res;
+ int errors;
+ TIME sttime,etime;
+
+ showmessage("\n"
+ "This test read data from first hard disk to test\n"
+ "disk throughtput.\n"
+ "Remeber that the reads are made block by block so\n"
+ "don't worry if you see a low throughtput.\n"
+ );
+
+ dev=bdev_find_byname(DISKDEVICE);
+ if (dev<0) {
+ cprintf("\nCan't find device to operate with\n");
+ return -1;
+ }
+ cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
+
+ cprintf("Please wait (reading %i MB linearly?!?)...",TEST_MB);
+
+ sttime=sys_gettime(NULL);
+ errors=0;
+ for (blk=0;blk<NUMBLOCK;blk++) {
+ res=bdev_read(dev,blk,buffer);
+ //res=bdev_seek(dev,blk);
+ if (res!=0) errors++;
+ }
+ etime=sys_gettime(NULL)-sttime;
+
+ cprintf("\nDone\n\n");
+ cprintf("elapse time : %li sec %li msec\n",
+ etime/1000000l,
+ (etime/1000l)%1000l);
+ cprintf("throughtput : %6.3f MB/s\n",
+ NUMBLOCK*512.0/1024.0/1024.0/etime*1000000.0);
+ //cprintf("soft reset made: %i\n",ide[0].errors);
+ cprintf("errors : %i\n",errors);
+ cprintf("\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/block/idetest3.c
===================================================================
--- branches/pj/oldexamples/block/idetest3.c (nonexistent)
+++ branches/pj/oldexamples/block/idetest3.c (revision 1085)
@@ -0,0 +1,66 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <fs/bdevinit.h>
+#include <fs/bdev.h>
+
+#include <string.h>
+
+#include "common.h"
+
+#define DISKDEVICE "ide/hda1"
+#define BLOCKNUMBER 58549
+
+__uint8_t buffer[2048] __attribute__ ((aligned (4)));
+
+extern char *ide_error_msg[];
+
+int main(int argc,char *argv[])
+{
+ __dev_t dev;
+ __blkcnt_t blk;
+ int res;
+ // int c;
+
+ showmessage("This test tries to read a block from the first hard disk\n"
+ "and then it tries to write it to disk\n"
+ "Press [CTRL-C] to abort...");
+
+ dev=bdev_find_byname(DISKDEVICE);
+ if ((int)dev<0) {
+ cprintf("Can't find device to operate with\n");
+ cprintf("%s not present!\n",DISKDEVICE);
+ return -1;
+ }
+ cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
+
+ blk=BLOCKNUMBER;
+
+ cprintf("Reading block %li...\n",(long)blk);
+ memset(buffer,0xff,sizeof(buffer));
+ res=bdev_read(dev,blk,buffer);
+ cprintf("Result %i\n",res);
+ //cprintf("Soft reset done %i\n",ide[0].errors);
+ if (res!=0) {
+ cprintf(" %s\n",(char*)ide_error_msg[-res]);
+ return -1;
+ }
+ debug_dump_buffer(buffer,64);
+
+ cprintf("Writing block %li...\n",(long)blk);
+ res=bdev_write(dev,blk,buffer);
+ cprintf("Result %i\n",res);
+ //cprintf("Soft reset done %i\n",ide[0].errors);
+ if (res!=0) {
+ cprintf(" %s\n",(char*)ide_error_msg[-res]);
+ }
+
+ waitend();
+ return 0;
+}
Index: branches/pj/oldexamples/block/idetx430.c
===================================================================
--- branches/pj/oldexamples/block/idetx430.c (nonexistent)
+++ branches/pj/oldexamples/block/idetx430.c (revision 1085)
@@ -0,0 +1,79 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/ll.h>
+#include <ll/stdlib.h>
+#include <kernel/func.h>
+#include <drivers/keyb.h>
+
+#include <fs/bdevinit.h>
+#include <fs/util.h>
+#include <fs/bdev.h>
+
+#include "../ide.h"
+#include "../debug.h"
+
+#define DISKDEVICE "ide/hda1"
+
+#define NUMBLOCK 1000
+
+__dev_t dev;
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ dev=bdev_find_byname(DISKDEVICE);
+ if (dev<0) {
+ cprintf("Can't find device to operate with\n");
+ sys_end();
+ return -1;
+ }
+ cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
+
+ return 0;
+}
+
+int __fs_sub_init(void)
+{
+ return 0;
+}
+
+__uint8_t buffer[2048];
+
+int main(int argc,char *argv[])
+{
+ __blkcnt_t blk;
+ int res;
+ int c,i,errors;
+ TIME sttime,etime;
+
+ cprintf("Press a key to continue\n\n");
+ c=keyb_getchar();
+ cprintf("Please wait (reading 100 blocks for 10 times)...");
+
+ sttime=sys_gettime(NULL);
+ errors=0;
+ for (blk=0;blk<100;blk++) {
+ for (i=0;i<10;i++) {
+ res=bdev_read(dev,blk,buffer);
+ if (res!=0) errors++;
+ }
+ }
+ etime=sys_gettime(NULL)-sttime;
+
+ cprintf("\nDone\n\n");
+ cprintf("elapse time : %li sec %li msec\n",
+ etime/1000000l,
+ (etime/1000l)%1000l);
+ cprintf("soft reset made: %i\n",ide[0].errors);
+ cprintf("errors : %i\n",errors);
+ cprintf("\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/block/idernd.c
===================================================================
--- branches/pj/oldexamples/block/idernd.c (nonexistent)
+++ branches/pj/oldexamples/block/idernd.c (revision 1085)
@@ -0,0 +1,68 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/bdev.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+#define DISKDEVICE "ide/hda1"
+
+#define NUMBLOCK 1000
+
+__dev_t dev;
+__uint8_t buffer[2048];
+
+int main(int argc,char *argv[])
+{
+ __blkcnt_t blk;
+ int res;
+ int errors;
+ TIME sttime,etime;
+
+ showmessage("\n"
+ "This test read RAMDOMLY data from first hard disk to test\n"
+ "disk throughtput.\n"
+ "Remeber that the reads are made RANDOMLY block by block so\n"
+ "don't worry if you see a VERY low throughtput.\n"
+ );
+ srand(7);
+
+ dev=bdev_find_byname(DISKDEVICE);
+ if (dev<0) {
+ cprintf("\nCan't find device to operate with\n");
+ return -1;
+ }
+ cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
+
+ cprintf("Please wait (reading %i KB ramdomly)...",NUMBLOCK/2);
+
+ sttime=sys_gettime(NULL);
+ errors=0;
+ for (blk=0;blk<NUMBLOCK;blk++) {
+ res=bdev_read(dev,rand()%5000,buffer);
+ if (res!=0) errors++;
+ }
+ etime=sys_gettime(NULL)-sttime;
+
+ cprintf("\nDone\n\n");
+ cprintf("elapse time : %li sec %li msec\n",
+ etime/1000000l,
+ (etime/1000l)%1000l);
+ cprintf("throughtput : %6.3f KB/s\n",
+ NUMBLOCK*512.0/1024.0/etime*1000000.0);
+ //cprintf("soft reset made: %i\n",ide[0].errors);
+ cprintf("errors : %i\n",errors);
+ cprintf("\n");
+
+ return 0;
+}
Index: branches/pj/oldexamples/block/common.c
===================================================================
--- branches/pj/oldexamples/block/common.c (nonexistent)
+++ branches/pj/oldexamples/block/common.c (revision 1085)
@@ -0,0 +1,75 @@
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* -- */
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ return 0;
+}
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ //sys_status(SCHED_STATUS);
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+/* -- */
+
+void showmessage(char *s)
+{
+ cputs(s);
+ cprintf("Press [x] to begin...");
+ while (keyb_getchar()!='x');
+ cprintf("\n");
+}
+
+void waitend(void)
+{
+ int c;
+ cprintf("Press [x] to exit...");
+ while ((c=keyb_getchar())!='x');
+ cprintf("\n");
+}
+
+/* -- */
+
+void debug_dump_buffer(char *buf, int size)
+{
+ int i;
+ for (i=0;i<size;i++) {
+ if (i%16==0) {
+ if (i!=0) cprintf("\n");
+ cprintf("%04x: ",i);
+ }
+ cprintf("%02x ",(unsigned char)*(buf+i));
+ }
+ cprintf("\n");
+}
Index: branches/pj/oldexamples/block/makefile
===================================================================
--- branches/pj/oldexamples/block/makefile (nonexistent)
+++ branches/pj/oldexamples/block/makefile (revision 1085)
@@ -0,0 +1,35 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS=idetest0 idetest1 idetest2 idetest3 idelin idernd
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+#
+#
+#
+
+idetest0:
+ make -f $(SUBMAKE) APP=idetest0 INIT=initblk.o OTHEROBJS=common.o
+
+idetest1:
+ make -f $(SUBMAKE) APP=idetest1 INIT=initblk.o OTHEROBJS=common.o
+
+idetest2:
+ make -f $(SUBMAKE) APP=idetest2 INIT=initblk.o OTHEROBJS=common.o
+
+idetest3:
+ make -f $(SUBMAKE) APP=idetest3 INIT=initblk.o OTHEROBJS=common.o
+
+idelin:
+ make -f $(SUBMAKE) APP=idelin INIT=initblk.o OTHEROBJS=common.o
+
+idernd:
+ make -f $(SUBMAKE) APP=idernd INIT=initblk.o OTHEROBJS=common.o
Index: branches/pj/oldexamples/block/common.h
===================================================================
--- branches/pj/oldexamples/block/common.h (nonexistent)
+++ branches/pj/oldexamples/block/common.h (revision 1085)
@@ -0,0 +1,11 @@
+
+#ifndef __COMMON_H
+#define __COMMON_H
+
+void showmessage(char *s);
+void waitend(void);
+
+void debug_dump_buffer(char *buf, int size);
+
+#endif
+
Index: branches/pj/fsdemo/gphoto.c
===================================================================
--- branches/pj/fsdemo/gphoto.c (nonexistent)
+++ branches/pj/fsdemo/gphoto.c (revision 1085)
@@ -0,0 +1,302 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gphoto.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:41 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "mutex.h"
+#include "gphoto.h"
+
+#ifdef FULLCOLOR
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+#else
+#define COLORFG 255
+#define COLORBG 0
+#endif
+
+#ifdef FULLCOLOR
+
+/* 16bits format 5:6:5 */
+/* 24bits format 8:8:8 */
+static void down24to16(int h ,
+ WORD *dst, BYTE *src,
+ int xs, int ys, int dx, int dy)
+{
+ WORD *pdst;
+ BYTE *psrc;
+ int x,y;
+ int n;
+
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+
+ for (y=0;y<dy;y++) {
+ psrc=src;
+ pdst=dst;
+
+ n=read(h,src,dx*3);
+ if (n!=dx*3) return;
+
+ for (x=0;x<dx;x++,psrc+=3,pdst++)
+ /* blue green red */
+ *pdst=((psrc[0]&0xf8)>>3)|((psrc[1]&0xfc)<<3)|((psrc[2]&0xf8)<<8);
+
+#ifndef NOGRX
+ grxlock();
+ grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
+ grxunlock();
+#endif
+
+ }
+
+}
+
+#define downscaleimage(h,x,y,a,b,c,d) down24to16(h,(WORD*)x,y,a,b,c,d)
+
+#else
+
+static void down24to8(int h,
+ BYTE *dst, BYTE *src,
+ int xs, int ys, int dx, int dy)
+{
+ BYTE *pdst;
+ BYTE *psrc;
+ int x,y;
+ int n;
+
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+
+ for (y=0;y<dy;y++) {
+ psrc=src;
+ pdst=dst;
+
+ n=read(h,src,dx*3);
+ if (n!=dx*3) return;
+
+ for (x=0;x<dx;x++,psrc+=3,pdst++)
+ *pdst=(((int)psrc[0])*11+((int)psrc[1])*59+((int)psrc[2])*30)/100;
+
+#ifndef NOGRX
+ grxlock();
+ grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
+ grxunlock();
+#endif
+
+ }
+}
+
+#define downscaleimage(h,x,y,a,b,c,d) down24to8(h,x,y,a,b,c,d)
+
+#endif
+
+/*
+ *
+ */
+
+struct taskinfo {
+ int h;
+ BYTE *dst,*src;
+ int x,y;
+ int dx,dy;
+};
+
+static TASK phototask(void *arg)
+{
+ struct taskinfo *p=(struct taskinfo *)arg;
+
+ downscaleimage(p->h,p->dst,p->src,p->x,p->y,p->dx,p->dy);
+
+ free(p->dst);
+ free(p->src);
+ close(p->h);
+
+ free(arg);
+
+ return NULL;
+}
+
+
+/*
+ *
+ */
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+int gphoto_show(char *title, char *pathname, int x, int y)
+{
+ NRT_TASK_MODEL model;
+ struct BITMAPFILEHEADER *bf;
+ struct BITMAPINFOHEADER *bi;
+ struct taskinfo *info;
+ BYTE *src,*dst;
+ long l;
+ int h,n;
+ int dx,dy;
+ PID pid;
+
+ bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
+ bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
+
+ if (bf==NULL||bi==NULL) return -11;
+
+ h=open(pathname,O_RDONLY);
+ if (h==-1) {
+ free(bf);
+ free(bi);
+ return -2;
+ }
+
+ n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
+ if (n!=sizeof(struct BITMAPFILEHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
+ if (n!=sizeof(struct BITMAPINFOHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ //grx_close();
+
+ /*
+ cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
+ cprintf("size: %li\n",bf->bfSize);
+ cprintf("tell: %li\n\n",bf->bfOffBits);
+
+ cprintf("bitcoutn: %i\n",bi->biBitCount);
+ cprintf("compress: %li\n",bi->biCompression);
+ cprintf("dx: %li\n",bi->biWidth);
+ cprintf("dy: %li\n",bi->biHeight);
+ */
+
+ //sys_end();
+ //return 0;
+
+ if (bf->bfType!='B'+256*'M'||
+ bi->biBitCount!=24||
+ bi->biCompression!=0||
+ bi->biWidth%4!=0) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -5;
+ }
+
+ dx=bi->biWidth;
+ dy=bi->biHeight;
+
+ src=(BYTE*)malloc(dx*3);
+ if (src==NULL) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ dst=(BYTE*)malloc(dx*2);
+ if (dst==NULL) {
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ l=lseek(h,bf->bfOffBits,SEEK_SET);
+ if (l!=bf->bfOffBits) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -7;
+ }
+
+#ifndef NOGRX
+ draw_frame(x,y,dx,dy);
+ grxlock();
+ grx_text(title,x,y-14,COLORFG,COLORBG);
+ grxunlock();
+#endif
+
+ free(bi);
+ free(bf);
+
+ info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
+ if (info==NULL) {
+ free(dst);
+ free(src);
+ close(h);
+ return -8;
+ }
+ info->h=h;
+ info->src=src;
+ info->dst=dst;
+ info->x=x;
+ info->y=y;
+ info->dx=dx;
+ info->dy=dy;
+
+ nrt_task_default_model(model);
+ nrt_task_def_arg(model,info);
+ pid=task_create("Photo",phototask,&model,NULL);
+
+ return pid;
+}
Index: branches/pj/fsdemo/gclock.c
===================================================================
--- branches/pj/fsdemo/gclock.c (nonexistent)
+++ branches/pj/fsdemo/gclock.c (revision 1085)
@@ -0,0 +1,81 @@
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+#include <kernel/model.h>
+#include <kernel/types.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+
+#include "mutex.h"
+#include "gclock.h"
+
+#ifdef FULLCOLOR
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+#else
+#define COLORFG 255
+#define COLORBG 0
+#endif
+
+struct info {
+ int x;
+ int y;
+};
+
+static TASK grxclock(struct info *ptr)
+{
+ char buffer[16];
+ int min,sec;
+
+ min=sec=0;
+ for (;;) {
+ sprintf(buffer,"%02i:%02i",min,sec);
+#ifndef NOGRX
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y,COLORFG,COLORBG);
+ grxunlock();
+#endif
+ sec++;
+ if (sec==60) {
+ sec=0;
+ min++;
+ if (min==60) min=0;
+ }
+ task_endcycle();
+ }
+ return NULL;
+}
+
+PID gclock_init(int x, int y)
+{
+ SOFT_TASK_MODEL model;
+ struct info *ptr;
+
+ ptr=(struct info *)malloc(sizeof(struct info));
+ if (ptr==NULL) return -1;
+ ptr->x=x+1;
+ ptr->y=y+1;
+
+#ifndef NOGRX
+ grxlock();
+ grx_box(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORBG);
+ grx_rect(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORFG);
+ grx_text("00:00",ptr->x,ptr->y,COLORFG,COLORBG);
+ grx_text("Clock",ptr->x,ptr->y-12,COLORFG,COLORBG);
+ grxunlock();
+#endif
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,5000);
+ soft_task_def_period(model,1000000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)ptr);
+ //soft_task_def_ctrl_jet(model);
+
+ return task_create("grxclock", grxclock, &model, NULL);
+}
Index: branches/pj/fsdemo/xread.c
===================================================================
--- branches/pj/fsdemo/xread.c (nonexistent)
+++ branches/pj/fsdemo/xread.c (revision 1085)
@@ -0,0 +1,236 @@
+/*
+ *
+ *
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <ll/i386/cons.h>
+
+#include <kernel/func.h>
+#include <kernel/int_sem.h>
+#define seminit(s,v) internal_sem_init(s,v)
+#define semwait(s) internal_sem_wait(s)
+#define semsignal(s) internal_sem_post(s)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <assert.h>
+
+#include "xread.h"
+
+/**/
+
+/*
+ */
+
+#ifndef ACTIVATE
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+void x_init(void)
+{}
+
+int x_initbuffer(int group, FILE *f, int rate, int band)
+{
+ return XUNUSEDPID;
+}
+
+#endif
+
+#ifdef ACTIVATE
+int x_fseek(FILE *file, long where, int from)
+{
+ return -1;
+}
+
+#define BLOCKSIZE (512*4)
+#define BLOCKSPERBUFFER (BUFFERMAXSIZE/BLOCKSIZE)
+
+/* in millisecondi */
+#define PRELOAD 500
+
+struct xbuffer *table[OPEN_MAX];
+
+int end_counter=0;
+
+static TASK bufferfiller(void *arg)
+{
+ struct xbuffer *ptr=(struct xbuffer *)arg;
+ int n;
+
+ for (;;) {
+ if (freespace(ptr)>BLOCKSIZE+8) {
+ //assert(ptr->writeptr>=0);
+ //assert(ptr->writeptr+BLOCKSIZE<=BUFFERMAXSIZE);
+ n=read(ptr->handle,ptr->buffer+ptr->writeptr,BLOCKSIZE);
+#ifdef NOGRX
+ cprintf("²");
+#endif
+ kern_cli();
+ ptr->writeptr+=n;
+ /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
+ if (ptr->writeptr>=BUFFERMAXSIZE) ptr->writeptr-=BUFFERMAXSIZE;
+ kern_sti();
+ if (n!=BLOCKSIZE) {
+ //cprintf("<XXX>");
+ break;
+ }
+ //assert(ptr->writeptr%512==0);
+ }
+ task_endcycle();
+ }
+
+ end_counter++;
+
+ return NULL;
+}
+
+void x_init(void)
+{
+ int i;
+ for (i=0;i<OPEN_MAX;i++) table[i]=NULL;
+}
+
+/* rate in bits/sec */
+/* band in percentuale *100 */
+int x_initbuffer(int group, FILE *f, int rate, int band)
+{
+#ifdef EDFSCHED
+ BDEDF_RES_MODEL resource;
+#endif
+#ifdef PSCANSCHED
+ BDPSCAN_RES_MODEL resource;
+#endif
+ SOFT_TASK_MODEL model;
+ struct xbuffer *ptr;
+ int handle;
+ int period,wcet;
+ int n,preload;
+ PID pid;
+
+ handle=fileno(f);
+ if (handle>OPEN_MAX||handle<0) return -11;
+
+ if (table[handle]!=NULL) return -2;
+
+ ptr=table[handle]=(struct xbuffer *)malloc(sizeof(struct xbuffer));
+ if (ptr==NULL) return -3;
+
+ ptr->handle=handle;
+ ptr->writeptr=ptr->readptr=0;
+ n=lseek(ptr->handle,0,SEEK_SET);
+ if (n!=0) {
+ cprintf("can't seek to 0\n");
+ return -12;
+ }
+
+ /* PRELOAD */
+ preload=rate*PRELOAD/8/1000;
+ if (preload<100*1024) preload=100*1024;
+ preload=(preload/BLOCKSIZE+1)*BLOCKSIZE;
+ if (preload>BUFFERMAXSIZE-BLOCKSIZE) return -4;
+ n=read(ptr->handle,ptr->buffer,preload);
+ if (n!=preload) {
+ cprintf("preload: request %li bytes (%li returned)\n",
+ (long)preload,(long)n);
+ return -5;
+ }
+ ptr->writeptr+=n;
+
+ //cprintf("%li bytes preloaded\n",(long)n);
+ if (rate==0) sys_abort(997);
+ period=1000000l*BLOCKSIZE/rate*8;
+ wcet=period*band/10000;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,wcet);
+ soft_task_def_wcet(model,wcet);
+ soft_task_def_period(model,period);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)ptr);
+ soft_task_def_group(model,group);
+
+#if defined(EDFSCHED)
+ BDEDF_res_default_model(resource);
+ BDEDF_res_def_dl(resource,period);
+ pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
+#elif defined(PSCANSCHED)
+ BDPSCAN_res_default_model(resource);
+ BDPSCAN_res_def_priority(resource,0);
+ pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
+#else
+ pid=task_create("xfill", bufferfiller, &model, NULL);
+#endif
+ if (pid!=-1) {
+ cprintf("task wcet=%10li period=%10li\n",(long)wcet,(long)period);
+ }
+
+ return pid;
+}
+
+size_t x_fread(void *buffer, size_t objsize, size_t n, FILE *file)
+{
+ struct xbuffer *ptr;
+ int size,sz;
+ int nv;
+
+ ptr=table[fileno(file)];
+ if (ptr==NULL) {
+ cprintf("x_fread with bad fd\n");
+ return 0;
+ }
+
+ size=objsize*n;
+ //cprintf("[for %i]",size);
+REDO:
+ if (filledspace(ptr)<size) {
+ /*
+ cprintf("x_fread called for %li bytes (%li available)\n",
+ (long)size,
+ (long)filledspace(ptr));
+ */
+ nv=n;
+ n=filledspace(ptr)/objsize;
+ if (n==0) {
+ n=nv;
+ task_delay(15000);
+ goto REDO;
+ return 0;
+ }
+ size=objsize*n;
+ /*cprintf("%i will return\n",size);*/
+ }
+
+ sz=BUFFERMAXSIZE-ptr->readptr;
+ if (sz>=size) {
+ //cprintf("X");
+ memcpy(buffer,ptr->buffer+ptr->readptr,size);
+ } else {
+ //cprintf("Y");
+ memcpy(buffer,ptr->buffer+ptr->readptr,sz);
+ assert(size-sz>0);
+ memcpy(buffer+sz,ptr->buffer,size-sz);
+ }
+
+ kern_cli();
+ ptr->readptr+=size;
+ /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
+ if (ptr->readptr>=BUFFERMAXSIZE) ptr->readptr-=BUFFERMAXSIZE;
+ kern_sti();
+
+ return n;
+}
+
+#endif
Index: branches/pj/fsdemo/initfile.c
===================================================================
--- branches/pj/fsdemo/initfile.c (nonexistent)
+++ branches/pj/fsdemo/initfile.c (revision 1085)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:41 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/fsdemo/gphoto.h
===================================================================
--- branches/pj/fsdemo/gphoto.h (nonexistent)
+++ branches/pj/fsdemo/gphoto.h (revision 1085)
@@ -0,0 +1,42 @@
+/*
+ *
+ *
+ */
+
+#ifndef __GPHOTO_H
+#define __GPHOTO_H
+
+#include <ll/sys/types.h>
+
+struct BITMAPFILEHEADER {
+ WORD bfType;
+ DWORD bfSize;
+ WORD bfReserved1;
+ WORD bfReserved2;
+ DWORD bfOffBits;
+} __attribute__((packed));
+
+struct BITMAPINFOHEADER {
+ DWORD biSize;
+ DWORD biWidth;
+ DWORD biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ DWORD biXPelsPerMeter;
+ DWORD biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+} __attribute__((packed));
+
+struct RGBQUAD {
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserverd;
+} __attribute__((packed));
+
+int gphoto_show(char *title, char *pathname, int x, int y);
+
+#endif
Index: branches/pj/fsdemo/mutex.h
===================================================================
--- branches/pj/fsdemo/mutex.h (nonexistent)
+++ branches/pj/fsdemo/mutex.h (revision 1085)
@@ -0,0 +1,32 @@
+
+#ifndef __GRXMUTEX_H
+#define __GRXMUTEX_H
+
+#include "config.h"
+
+#ifdef GRXMUTEX
+
+#include <kernel/int_sem.h>
+
+#define g_sem_t internal_sem_t
+
+#define g_sem_init(s,value) internal_sem_init(s,value)
+#define g_sem_wait(s) internal_sem_wait(s)
+#define g_sem_signal(s) internal_sem_post(s)
+
+#else
+
+#define g_sem_t int
+
+#define g_sem_init(s,value)
+#define g_sem_wait(s)
+#define g_sem_signal(s)
+
+#endif
+
+extern g_sem_t grxsem;
+
+#define grxlock() g_sem_wait(&grxsem)
+#define grxunlock() g_sem_signal(&grxsem)
+
+#endif
Index: branches/pj/fsdemo/gclock.h
===================================================================
--- branches/pj/fsdemo/gclock.h (nonexistent)
+++ branches/pj/fsdemo/gclock.h (revision 1085)
@@ -0,0 +1,13 @@
+
+
+#ifndef __GCLOCK_H
+#define __GCLOCK_H
+
+#include <kernel/types.h>
+
+PID gclock_init(int x, int y);
+
+#define GCLOCKDX (5*8+2)
+#define GCLOCKDY (1*8+2)
+
+#endif
Index: branches/pj/fsdemo/xread.h
===================================================================
--- branches/pj/fsdemo/xread.h (nonexistent)
+++ branches/pj/fsdemo/xread.h (revision 1085)
@@ -0,0 +1,46 @@
+
+#ifndef XREAD_H_
+#define XREAD_H_
+
+#include <stdio.h>
+
+#define BUFFERMAXSIZE (128*1024l)
+
+struct xbuffer {
+ int handle;
+ char buffer[BUFFERMAXSIZE+8];
+ int readptr;
+ int writeptr;
+};
+extern struct xbuffer *table[OPEN_MAX];
+
+void x_init(void);
+
+/* rate in bit/sec */
+/* band in percentuale */
+int x_initbuffer(int group, FILE *f, int rate, int band);
+
+#define XUNUSEDPID 5821
+
+/*
+ *
+ */
+
+static __inline__ int filledspace(struct xbuffer *ptr)
+{
+ int size;
+
+ if (ptr->writeptr==ptr->readptr) return 0;
+
+ size=ptr->writeptr-ptr->readptr;
+ if (size<0) size+=BUFFERMAXSIZE;
+
+ return size;
+}
+
+static __inline__ int freespace(struct xbuffer *ptr)
+{
+ return BUFFERMAXSIZE-filledspace(ptr);
+}
+
+#endif
Index: branches/pj/fsdemo/config.h
===================================================================
--- branches/pj/fsdemo/config.h (nonexistent)
+++ branches/pj/fsdemo/config.h (revision 1085)
@@ -0,0 +1,44 @@
+
+/*
+ *
+ */
+
+/* if def: does not use graphics */
+#define NOGRX 1
+#undef NOGRX
+
+/* if def: use a mutex for all graphics operations */
+#define GRXMUTEX 1
+#undef GRXMUTEX
+
+/* if def: use full color (16bits.. sigh) else use 8 bits/pixel grayscale */
+#define FULLCOLOR 1
+#undef FULLCOLOR
+
+/*
+ *
+ */
+
+/* if def: does not trace events (does not work) */
+#define NOTRACE 1
+//#undef NOTRACE
+
+/*
+ *
+ */
+
+/* if def: activate task buffering */
+#define ACTIVATE 1
+//#undef ACTIVATE
+
+/*
+ *
+ */
+
+/* if def: use bd_edf resource for I/O tasks */
+#define EDFSCHED 1
+#undef EDFSCHED
+
+/* if def: use bd_pscan resources for I/O tasks */
+#define PSCANSCHED 1
+#undef PSCANSCHED
Index: branches/pj/fsdemo/readme
===================================================================
--- branches/pj/fsdemo/readme (nonexistent)
+++ branches/pj/fsdemo/readme (revision 1085)
@@ -0,0 +1,21 @@
+S.Ha.R.K. FSDEMO
+
+This demo has been made as a thesis demo by Massimiliano Giorgi
+(massy@gandalf.sssup.it). The following is the translations of some itailan
+notes left my Massy. For any problems, please contact us
+shark-help@gandalf.sssup.it...
+
+bye
+
+Paolo
+
+----------------------------------------------------------------------------
+
+mplay is the demo I used during my thesis presentation.
+
+To use the demo you need a few mpeg files (those listed into mplay.c) into the directory /temp/m/ and some BMP photos into the directory /temp/b/
+
+Note that only BMP 24bpp images are supported. They MUST have a DIB header,
+with a line length mujltiple of 4 pixels!!!
+
+Massy
Index: branches/pj/fsdemo/gvideo.c
===================================================================
--- branches/pj/fsdemo/gvideo.c (nonexistent)
+++ branches/pj/fsdemo/gvideo.c (revision 1085)
@@ -0,0 +1,292 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gvideo.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:41 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+
+#include "mpeg/video.h"
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+#include "mutex.h"
+#include "gvideo.h"
+#include "gbuffer.h"
+#include "xread.h"
+
+#define STARTGROUP 513
+
+#define VIDEORATE 70
+#define READRATE 30
+
+/*
+ * colors
+ */
+
+#ifdef FULLCOLOR
+
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+
+#define SP rgb16(0,128,0)
+#define FG rgb16(255,255,255)
+#define BG rgb16(0,0,0)
+
+#else
+
+/* for writing */
+#define COLORFG 255
+#define COLORBG 0
+
+/* for box */
+#define SP 128
+#define FG 255
+#define BG 0
+
+#endif
+
+/* border size (pixels) */
+#define BO 4
+
+/*
+ *
+ */
+
+#ifdef FULLCOLOR
+/* 16bits format 5:6:5 */
+/* 32bits format 8:8:8:0 */
+void down32to16(WORD *dst, BYTE *src, int size)
+{
+ int i;
+ return;
+ for (i=0;i<size;i+=4,dst++,src+=4)
+ /* blue green red */
+ *dst=((src[2]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[0]&0xf8)<<8);
+}
+#endif
+
+/*
+ *
+ */
+
+void draw_frame(int x, int y, int dx, int dy)
+{
+#ifndef NOGRX
+ grxlock();
+ grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
+ grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
+ grx_box(x,y,x+dx-1,y+dy-1,BG);
+ grx_rect(x-1,y-1,x+dx,y+dy,FG);
+ grxunlock();
+#endif
+}
+
+struct info {
+ int x,y;
+ ImageDesc *img;
+};
+
+static TASK play(void *arg)
+{
+ struct info *ptr=(struct info*)arg;
+ int x1,y1,x2,y2;
+ BYTE *pixels; //,*image;
+ int moreframes;
+
+ pixels=(BYTE*)malloc(ptr->img->Size*sizeof(BYTE));
+#ifdef FULLCOLOR
+ image=(BYTE*)malloc(ptr->img->Size/2*sizeof(BYTE));
+#endif
+ x1=ptr->x;
+ y1=ptr->y;
+ x2=x1+ptr->img->Width-1;
+ y2=y1+ptr->img->Height-1;
+
+ moreframes=1;
+ for (;;) {
+ while (moreframes) {
+ moreframes=GetMPEGFrame(ptr->img,pixels);
+#ifndef NOGRX
+#ifdef FULLCOLOR
+ down32to16((WORD*)image,pixels,ptr->img->Size);
+ grxlock();
+ grx_putimage(x1, y1, x2, y2, pixels);
+ grxunlock();
+#else
+ grxlock();
+ grx_putimage(x1, y1, x2, y2, pixels);
+ grxunlock();
+#endif
+#else
+ cprintf("%c",'0');
+#endif
+ task_endcycle();
+ }
+ break;
+
+ //if (!loop) break;
+ //RewindMPEG (mpeg, img);
+ //SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ //moreframes = TRUE;
+ }
+
+ return NULL;
+}
+
+int gvideo_init(char *title, struct gvideoinfo *ptr)
+{
+ // static int groupcounter=0;
+ struct info *info;
+ SOFT_TASK_MODEL model;
+ FILE *fin;
+ PID pid,pid2;
+ ImageDesc *img;
+ int res;
+ int i;
+ int period,wcet;
+ int group;
+
+ img=(ImageDesc*)malloc(sizeof(ImageDesc));
+ if (img==NULL) return -3;
+ img->vid_stream=NULL;
+ img->Colormap=NULL;
+
+ info=(struct info*)malloc(sizeof(struct info));
+ if (info==NULL) return -11;
+ info->img=img;
+ info->x=ptr->x;
+ info->y=ptr->y;
+
+ fin=fopen(ptr->pathname, "r");
+ if (!fin) return -1;
+
+ //group=STARTGROUP+groupcounter++;
+ group=STARTGROUP;
+ pid2=x_initbuffer(group,fin,ptr->bitrate,ptr->band*READRATE);
+ if (pid2<0) return -2;
+
+#ifdef ACTIVATE
+ gbuffer_init(table[fileno(fin)],group,20+12,450);
+#else
+ gbuffer_init(NULL,group,20+12,450);
+#endif
+
+ res=OpenMPEG(fin,img);
+ if (!res) return -4;
+
+#ifdef FULLCOLOR
+ SetMPEGOption(img,MPEG_DITHER,HALF_COLOR_DITHER);
+#else
+ SetMPEGOption(img,MPEG_DITHER,GRAY_DITHER);
+#endif
+
+ //cprintf("colrmap size=%8i\n",img->ColormapSize);
+ //cprintf("picture rate=%8i\n",img->PictureRate);
+ //cprintf("bit rate =%8i\n",img->BitRate);
+
+#ifndef FULLCOLOR
+ if (group==STARTGROUP) {
+ ColormapEntry *cp;
+ cp=img->Colormap;
+ for (i=0;i<img->ColormapSize;i++) {
+#ifndef NOGRX
+ grxlock();
+ grx_setcolor (i,img->Colormap[i].red/4,
+ img->Colormap[i].green/4,
+ img->Colormap[i].blue/4);
+ grxunlock();
+#endif
+ }
+ }
+#endif
+
+ draw_frame(info->x,info->y,img->Width,img->Height);
+ ptr->w=img->Width;
+ ptr->h=img->Height;
+
+ {
+ char buffer[256];
+
+#ifndef NOGRX
+ grxlock();
+ grx_text(title,ptr->x,ptr->y-14,COLORFG,COLORBG);
+ grxunlock();
+ sprintf(buffer,"Average bit rate: %i.%03i Mb/s",
+ ptr->bitrate/1024/1024,(ptr->bitrate%(1024*1024))*1000/1024/1000);
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2,COLORFG,COLORBG);
+ grxunlock();
+ sprintf(buffer,"Frame rate : %02.3f frame/sec",
+ (double)ptr->framerate/100.0);
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2+9,COLORFG,COLORBG);
+ grxunlock();
+#endif
+ }
+
+ period=100000000/ptr->framerate;
+ wcet=period*ptr->band*VIDEORATE/10000;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,wcet);
+ soft_task_def_wcet(model,wcet);
+ soft_task_def_period(model,period);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)info);
+ soft_task_def_group(model,group);
+ soft_task_def_ctrl_jet(model);
+
+ pid=task_create("Video",play,&model,NULL);
+ if (pid==-1) return -6;
+
+ return group;
+}
Index: branches/pj/fsdemo/gbuffer.c
===================================================================
--- branches/pj/fsdemo/gbuffer.c (nonexistent)
+++ branches/pj/fsdemo/gbuffer.c (revision 1085)
@@ -0,0 +1,129 @@
+/*
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "mutex.h"
+#include "xread.h"
+
+#define PERIOD 250000
+#define WCET 1000
+
+#ifdef FULLCOLOR
+
+#define BARCOLOR rgb16(255,0,0)
+#define BARBG rgb16(0,0,0)
+
+#define TEXTCOLOR rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define BARCOLOR 128
+#define BARBG 0
+
+#define TEXTCOLOR 255
+#define TEXTBG 0
+
+#endif
+
+//#define XC 700
+//#define YC 400
+#define LEN 100
+#define BORDER 8
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+struct taskinfo{
+ int XC,YC;
+ struct xbuffer *ptr;
+};
+
+static TASK monitorbuffer(void *arg)
+{
+ struct taskinfo *p=(struct taskinfo *)arg;
+ int XC,YC;
+ int oy,y;
+ struct xbuffer *ptr;
+ int sum,old;
+
+ ptr=p->ptr;
+ XC=p->XC;
+ YC=p->YC;
+
+ oy=YC+LEN-1;
+ for (;;) {
+ sum=freespace(ptr);
+#ifndef NOGRX
+ y=YC+LEN*sum/BUFFERMAXSIZE-1;
+ if (y!=oy) {
+ grxlock();
+ if (y<oy) grx_box(XC,y,XC+BORDER-1,oy,BARCOLOR);
+ else grx_box(XC,oy,XC+BORDER-1,y,BARBG);
+ grxunlock();
+ oy=y;
+ }
+#else
+ cprintf("@%i@",sum);
+#endif
+ old=sum;
+ task_endcycle();
+ }
+ return 0;
+}
+
+int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC)
+{
+ struct taskinfo *info;
+ SOFT_TASK_MODEL model;
+ PID pid;
+
+#ifdef ACTIVATE
+ info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
+ if (info==NULL) sys_abort(912);
+ info->XC=XC;
+ info->YC=YC;
+ info->ptr=ptr;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,WCET);
+ soft_task_def_wcet(model,WCET);
+ soft_task_def_period(model,PERIOD);
+ soft_task_def_periodic(model);
+ soft_task_def_group(model,group);
+ soft_task_def_arg(model,(void*)info);
+ /*soft_task_def_group(model,group);*/
+
+ pid=task_create("bufferload",monitorbuffer,&model,NULL);
+ if (pid==-1) return -6;
+
+#else
+ pid=-1;
+#endif
+
+#ifndef NOGRX
+ draw_frame(XC,YC,BORDER,LEN);
+ grxlock();
+ grx_text("Buffer",XC-18,YC+LEN+BORDER*2,TEXTCOLOR,TEXTBG);
+ grx_text("100%",XC+BORDER*2+1,YC-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 75%",XC+BORDER*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 50%",XC+BORDER*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 25%",XC+BORDER*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 0%",XC+BORDER*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
+ grxunlock();
+#endif
+
+ return pid;
+}
+
Index: branches/pj/fsdemo/gvideo.h
===================================================================
--- branches/pj/fsdemo/gvideo.h (nonexistent)
+++ branches/pj/fsdemo/gvideo.h (revision 1085)
@@ -0,0 +1,22 @@
+/*
+ *
+ *
+ */
+
+#ifndef __GVIDEO_H
+#define __GVIDEO_H
+
+struct gvideoinfo {
+ int x,y;
+ int h,w; /* no fill */
+
+ char *pathname;
+
+ int bitrate; /* bytes/sec */
+ int framerate; /* frames/sec */
+ int band; /* CPU band in percent */
+};
+
+int gvideo_init(char *title, struct gvideoinfo *info);
+
+#endif
Index: branches/pj/fsdemo/mplay.c
===================================================================
--- branches/pj/fsdemo/mplay.c (nonexistent)
+++ branches/pj/fsdemo/mplay.c (revision 1085)
@@ -0,0 +1,384 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:41 $
+ */
+
+#include "config.h"
+
+//#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#include <drivers/glib.h>
+#include <drivers/gd.h>
+#include <drivers/keyb.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "gclock.h"
+#include "gvideo.h"
+#include "gload.h"
+#include "gbuffer.h"
+#include "gphoto.h"
+#include "mutex.h"
+#include "xread.h"
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+#ifndef NOGRX
+ grx_close();
+#endif
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+/*
+ *
+ *
+ *
+ */
+
+int __register_sub_init_prologue(void)
+{
+ // int id;
+#ifndef NOTRACE
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_trace_class(TRC_CLASS_USER);
+ trc_assign_class_to_queue(TRC_CLASS_USER,id);
+#endif
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+#if defined(EDFSCHED)
+ extern void BD_EDF_register_module(void);
+ BD_EDF_register_module();
+#elif defined(PSCANSCHED)
+ extern void BD_PSCAN_register_module(void);
+ BD_PSCAN_register_module();
+#endif
+ return 0;
+}
+
+dev_t root_device=-1;
+dev_t temp_device=-1;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+ */
+
+ return 0;
+}
+
+int __fs_sub_init(void)
+{
+ extern int libc_initialize(void);
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ // struct mount_opts opts;
+ // int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ /*
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ } else
+ cprintf("mounted /TEMP rw\n");
+ }
+ */
+
+ libc_initialize();
+
+#ifndef NOTRACE
+ TRC_init_phase2();
+#endif
+
+ return 0;
+}
+
+/*
+ *
+ *
+ *
+ */
+
+struct {
+ char *filename;
+ int bitrate;
+ int framerate;
+} mpegs[16]={
+ /* 0 */
+ {"/temp/m/2jaeger.mpg", 573225, 3000}, /* 3.27 bad*/
+ {"/temp/m/alien.mpg", 289000, 2500}, /* 10.12 I */
+ {"/temp/m/b0.mpg", 1725251, 3000}, /* 3.33 IBBPBBPBBPBB */
+ {"/temp/m/canyon.mpg", 237194, 3000}, /* 58.60 IBBPBB */
+ /* 4 */
+ {"/temp/m/earth-ci.mpg", 974900, 2500}, /* 28.80 IBBPBB */
+ {"/temp/m/flower.mpg", 1147101, 2997}, /* 5.01 bad */
+ {"/temp/m/frisco.mpg", 397262, 3000}, /* 1.70 bad */
+ {"/temp/m/hulahoop.mpg", 684126, 3000}, /* 1.33 bad */
+ /* 8 */
+ {"/temp/m/iicm.mpg", 527308, 3000}, /* 26.70 bad */
+ {"/temp/m/micky.mpg", 711240, 3000}, /* 0.66 bad */
+ {"/temp/m/mobile.mpg", 114622, 2997}, /* 5.01 bad */
+ {"/temp/m/redsnigh.mpg", 597776, 2500}, /* 48.40 IBBBBBBBBBPBBBBBBBBB*/
+ /* 12 */
+ {"/temp/m/son.mpg", 1134335, 2500}, /* 6.92 IBBPBBPBBPBB */
+ {"/temp/m/stoelend.mpg", 2248942, 3000}, /* 0.53 IBBPBB */
+ {"/temp/m/sukhoi.mpg", 481521, 3000}, /* 25.47 I */
+ {"/temp/m/us.mpg", 681599, 3000} /* 24.37 IBBPBB */
+};
+
+#define DEFINDEX 3
+
+char *getfilename(int index)
+{
+ return mpegs[index%16].filename;
+}
+
+int getbitrate(int index)
+{
+ return mpegs[index%16].bitrate;
+}
+
+int getframerate(int index)
+{
+ return mpegs[index%16].framerate;
+}
+
+/*
+ *
+ *
+ *
+ */
+
+#ifdef FULLCOLOR
+
+#define TEXTCOLOR rgb16(0,255,0)
+#define TEXTCOLOR2 rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define TEXTCOLOR 255
+#define TEXTCOLOR2 255
+#define TEXTBG 0
+
+#endif
+
+#define SCREENX 800
+#define SCREENY 600
+
+#define MAINSLEEP 20000
+
+g_sem_t grxsem;
+
+int main(int argc, char *argv[])
+{
+ struct gvideoinfo info;
+ KEY_EVT k;
+ int index;
+ int mode;
+ int esc;
+ int pid,grp;
+ // int i;
+ int sx=20;
+ PID ph1,ph2,ph3;
+
+ g_sem_init(&grxsem,1);
+
+ /*
+ if (argc<2) {
+ cprintf("Usage: %s mpegfileordinal\n",argv[0]);
+ sys_abort(301);
+ }
+ */
+
+ /* init the "file reader tasks" module */
+ x_init();
+
+ /* Init the graph... */
+#ifndef NOGRX
+ if (grx_init()==-1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+#ifdef FULLCOLOR
+ mode=grx_getmode(SCREENX,SCREENY,16);
+#else
+ mode=grx_getmode(SCREENX,SCREENY,8);
+#endif
+ if (mode==-1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+ cprintf("[hit enter to continue]\n");
+ esc=FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii==13) esc=TRUE;
+ }
+
+#ifndef NOGRX
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+#ifndef NOGRX
+ grx_text("HARTIK 4.0 (Lego)",12*2,22,TEXTCOLOR,TEXTBG);
+ grx_text("[Filesystem demo]",12*2,22+10,TEXTCOLOR,TEXTBG);
+
+ grx_text("Video : 8bit/pixel",250,450,TEXTCOLOR2,TEXTBG);
+ grx_text("Double buffer: YES",250,450+10,TEXTCOLOR2,TEXTBG);
+ grx_text("Algorithm : FCFS",250,450+20,TEXTCOLOR2,TEXTBG);
+#endif
+
+ pid=gclock_init(32+64+64,540);
+ task_activate(pid);
+
+ //for (i=0;i<argc-1;i++) {
+
+ //index=atoi(argv[i+1]);
+ index=4;
+
+ info.x=sx+30;
+ info.y=80;
+ info.pathname=getfilename(index);
+ info.bitrate=getbitrate(index);
+ info.framerate=getframerate(index);
+ info.band=25;
+
+ grp=gvideo_init("Video: earth.mpg", &info);
+ //if (grp>0) group_activate(grp);
+
+ sx+=info.w+15;
+ //}
+
+ pid=gload_init(1);
+ task_activate(pid);
+
+ ph1=gphoto_show("Photo: galaxy","/temp/b/ph2a.bmp",500,25);
+ ph2=gphoto_show("Photo: canyon","/temp/b/ph3a.bmp",500,225);
+ ph3=gphoto_show("Photo: nicole","/temp/b/ph7a.bmp",500,425);
+
+ if (grp>0) group_activate(grp);
+
+ esc=0;
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK)) {
+ if(k.ascii==13) esc=1;
+ else if (k.ascii=='a') task_activate(ph1);
+ else if (k.ascii=='s') task_activate(ph2);
+ else if (k.ascii=='d') task_activate(ph3);
+ }
+ task_delay(MAINSLEEP);
+ }
+
+#ifndef NOGRX
+ grx_close();
+#endif
+
+ sys_end();
+ return 0;
+}
Index: branches/pj/fsdemo/gbuffer.h
===================================================================
--- branches/pj/fsdemo/gbuffer.h (nonexistent)
+++ branches/pj/fsdemo/gbuffer.h (revision 1085)
@@ -0,0 +1,9 @@
+
+#ifndef __GBUFFER_H
+#define __GBUFFER_H
+
+#include "xread.h"
+
+int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC);
+
+#endif
Index: branches/pj/fsdemo/gload.c
===================================================================
--- branches/pj/fsdemo/gload.c (nonexistent)
+++ branches/pj/fsdemo/gload.c (revision 1085)
@@ -0,0 +1,113 @@
+/*
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "mutex.h"
+#include "gload.h"
+
+#define PERIOD 250000
+#define WCET 1000
+
+#ifdef FULLCOLOR
+
+#define BARCOLOR rgb16(255,0,0)
+#define BARBG rgb16(0,0,0)
+
+#define TEXTCOLOR rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define BARCOLOR 128
+#define BARBG 0
+
+#define TEXTCOLOR 255
+#define TEXTBG 0
+
+#endif
+
+#define XC (32+64)
+#define YC 450
+#define LEN 100
+#define BOR 8
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+/* only for NRT task */
+static TASK monitorload(void *arg)
+{
+ int oy,y;
+ PID pid=(PID)arg;
+ TIME sum,old;
+ int res;
+
+ res=jet_getstat(pid,NULL,NULL,NULL,&old);
+ task_endcycle();
+
+ oy=YC+LEN-1;
+ for (;;) {
+ res=jet_getstat(pid,NULL,NULL,NULL,&sum);
+ if (res==-1) break;
+#ifndef NOGRX
+ y=YC+LEN*(sum-old)/PERIOD-1;
+ if (y!=oy) {
+ grxlock();
+ if (y<oy) grx_box(XC,y,XC+BOR-1,oy,BARCOLOR);
+ else grx_box(XC,oy,XC+BOR-1,y,BARBG);
+ grxunlock();
+ oy=y;
+ }
+#else
+ n++;
+ if (n%4==0)
+ cprintf("#%li,%i#",sum); //(1000-sum*1000/PERIOD);
+#endif
+ old=sum;
+ task_endcycle();
+ }
+ return 0;
+}
+
+int gload_init(int taskpid)
+{
+ SOFT_TASK_MODEL model;
+ PID pid;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,WCET);
+ soft_task_def_wcet(model,WCET);
+ soft_task_def_period(model,PERIOD);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)taskpid);
+ /*soft_task_def_group(model,group);*/
+
+ pid=task_create("load",monitorload,&model,NULL);
+ if (pid==-1) return -6;
+
+#ifndef NOGRX
+ draw_frame(XC,YC,BOR,LEN);
+ grxlock();
+ grx_text("Load",XC-10,YC+LEN+BOR*2,TEXTCOLOR,TEXTBG);
+ grx_text("100%",XC+BOR*2+1,YC-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 75%",XC+BOR*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 50%",XC+BOR*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 25%",XC+BOR*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 0%",XC+BOR*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
+ grxunlock();
+#endif
+
+ return pid;
+}
+
Index: branches/pj/fsdemo/gphoto.ok
===================================================================
--- branches/pj/fsdemo/gphoto.ok (nonexistent)
+++ branches/pj/fsdemo/gphoto.ok (revision 1085)
@@ -0,0 +1,222 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gphoto.ok,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2002-09-02 09:37:41 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "mutex.h"
+#include "gphoto.h"
+
+#ifdef FULLCOLOR
+
+/* 16bits format 5:6:5 */
+/* 24bits format 8:8:8 */
+static void down24to16(WORD *dst, BYTE *src, int dx, int dy)
+{
+ int x,y;
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+ dst+=dx*(dy+1);
+ for (y=0;y<dy;y++) {
+ dst-=dx*2;
+ for (x=0;x<dx;x++,src+=3,dst++)
+ /* blue green red */
+ *dst=((src[0]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[2]&0xf8)<<8);
+ }
+}
+
+#define downscaleimage(x,y,z,k) down24to16((WORD*)x,y,z,k)
+
+#else
+
+static void down24to8(BYTE *dst, BYTE *src, int dx, int dy)
+{
+ int x,y;
+
+ dst+=dx*(dy+1);
+ for (y=0;y<dy;y++) {
+ dst-=dx*2;
+ for (x=0;x<dx;x++,src+=3,dst++)
+ *dst=(((int)src[0])*11+((int)src[1])*59+((int)src[2])*30)/100;
+ }
+}
+
+#define downscaleimage(x,y,z,k) down24to8(x,y,z,k)
+
+#endif
+
+/*
+ *
+ */
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+int gphoto_show(char *pathname, int x, int y)
+{
+ struct BITMAPFILEHEADER *bf;
+ struct BITMAPINFOHEADER *bi;
+ BYTE *src,*dst;
+ long l;
+ int h,n;
+ int dx,dy;
+
+ bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
+ bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
+
+ if (bf==NULL||bi==NULL) return -1;
+
+ h=open(pathname,O_RDONLY);
+ if (h==-1) {
+ free(bf);
+ free(bi);
+ return -2;
+ }
+
+ n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
+ if (n!=sizeof(struct BITMAPFILEHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
+ if (n!=sizeof(struct BITMAPINFOHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ //grx_close();
+
+ /*
+ cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
+ cprintf("size: %li\n",bf->bfSize);
+ cprintf("tell: %li\n\n",bf->bfOffBits);
+
+ cprintf("bitcoutn: %i\n",bi->biBitCount);
+ cprintf("compress: %li\n",bi->biCompression);
+ cprintf("dx: %li\n",bi->biWidth);
+ cprintf("dy: %li\n",bi->biHeight);
+ */
+
+ //sys_end();
+ //return 0;
+
+ if (bf->bfType!='B'+256*'M'||
+ bi->biBitCount!=24||
+ bi->biCompression!=0||
+ bi->biWidth%4!=0) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -5;
+ }
+
+ dx=bi->biWidth;
+ dy=bi->biHeight;
+
+ src=(BYTE*)malloc(dx*dy*3);
+ if (src==NULL) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ dst=(BYTE*)malloc(dx*dy*2);
+ if (dst==NULL) {
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ l=lseek(h,bf->bfOffBits,SEEK_SET);
+ if (l!=bf->bfOffBits) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -7;
+ }
+
+ n=read(h,src,dx*dy*3);
+ if (n!=dx*dy*3) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -8;
+ }
+
+ downscaleimage(dst,src,dx,dy);
+
+#ifndef NOGRX
+ draw_frame(x,y,dx,dy);
+ grxlock();
+ grx_putimage(x, y, x+dx-1, y+dy-1, dst);
+ grxunlock();
+#endif
+
+ free(dst);
+ free(src);
+ close(h);
+ free(bi);
+ free(bf);
+
+ return 0;
+}
Index: branches/pj/fsdemo/gload.h
===================================================================
--- branches/pj/fsdemo/gload.h (nonexistent)
+++ branches/pj/fsdemo/gload.h (revision 1085)
@@ -0,0 +1,7 @@
+
+#ifndef __GLOAD_H
+#define __GLOAD_H
+
+int gload_init(int pid);
+
+#endif
Index: branches/pj/fsdemo/oldmakefile
===================================================================
--- branches/pj/fsdemo/oldmakefile (nonexistent)
+++ branches/pj/fsdemo/oldmakefile (revision 1085)
@@ -0,0 +1,41 @@
+#
+#
+#
+# TO REMAKE BETTER
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+.PHONY: test all install depend clean cleanall
+
+C_INC+= -I$(BASE)/ports
+LINK_LIB+= -lmpeg
+LINK_DEP+= $(LIB_PATH)/libmpeg.a
+
+#test:: tserv tserv2
+test:: mplay
+
+clean::
+ rm -f *.o
+ rm -f mplay
+
+OBJS= mplay.o xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o
+
+mplay: $(OBJS) $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) \
+ $(OBJS) \
+ $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay
+
+depend::
+ $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
+
+deps:
+ $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
+
+include deps
Index: branches/pj/fsdemo/makefile
===================================================================
--- branches/pj/fsdemo/makefile (nonexistent)
+++ branches/pj/fsdemo/makefile (revision 1085)
@@ -0,0 +1,28 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= mplay
+
+include $(BASE)/config/example.mk
+
+mplay:
+ make -f $(SUBMAKE) APP=mplay INIT= OTHEROBJS="xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o initfile.o" OTHERINCL="-I$(BASE)/ports"
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/dosfs/dosfs.c
===================================================================
--- branches/pj/dosfs/dosfs.c (nonexistent)
+++ branches/pj/dosfs/dosfs.c (revision 1085)
@@ -0,0 +1,174 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: dosfs.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and Gabriele Bolognini
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "string.h"
+#include "ll/i386/x-dos.h"
+
+
+/* This is the buffer used by read_myfile */
+char myfilebuf[1000];
+
+/* This is the number of bytes read by read_myfile */
+int myfilebuf_length;
+
+/* This function write myfile.out (up to 30 chars) */
+void write_myfile(void *arg);
+
+int main(int argc, char **argv)
+{
+ int x;
+
+ cprintf("\nBuffer contents:\n");
+
+ for (x=0; x<myfilebuf_length; x++)
+ cputc(myfilebuf[x]);
+
+ /*
+ WARNING: You can call these functions only when you are in
+ real mode!!!
+
+ The system is in real mode:
+ - into __kernel_register_levels__()
+ - into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT
+ */
+
+ if (myfilebuf_length)
+ sys_atrunlevel(write_myfile, NULL, RUNLEVEL_AFTER_EXIT);
+
+ return 0;
+ /*
+ * Since there is only one user task, the kernel will shut down after this
+ * task finishes...
+ */
+}
+
+/* This function read myfile.txt (up to 1000 chars) */
+void read_myfile(void)
+{
+ /* DOS file descriptor */
+ DOS_FILE *f;
+
+ /* Error code */
+ int err;
+
+ /* open the DOS file for reading (you can specify only "r" or "w") */
+ f = DOS_fopen("myfile.txt","r");
+
+ /* check for open errors */
+ if (!f) {
+ /* error!! */
+ err = DOS_error();
+
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening myfile.txt...\n", err);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ /* read up to 1000 chars */
+ myfilebuf_length = DOS_fread(&myfilebuf,1,1000,f);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Read %d bytes from myfile.txt...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading myfile.txt...\n", err);
+ myfilebuf_length = 0;
+ /* there is not return because I want to close the file! */
+ }
+
+ /* Close the file */
+ DOS_fclose(f);
+}
+
+/* This function write myfile.out (up to 30 chars) */
+void write_myfile(void *arg)
+{
+ DOS_FILE *f; /* DOS file descriptor */
+ int err; /* Error code */
+ int maxbytes;
+ int writtenbytes; /* number of files written */
+
+ /* open the DOS file for writing (you can specify only "r" or "w") */
+ f = DOS_fopen("myfile.out","w");
+
+ /* check for open errors */
+ if (!f) {
+ /* error!! */
+ err = DOS_error();
+
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening myfile.out...\n", err);
+ return;
+ }
+
+ /* write up to 30 bytes */
+ if (myfilebuf_length > 30)
+ maxbytes = 30;
+ else
+ maxbytes = myfilebuf_length;
+
+ writtenbytes = DOS_fwrite(myfilebuf,1,maxbytes,f);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Written %d bytes into myfile.out...\n", writtenbytes);
+
+ if (err) {
+ cprintf("Error %d writing myfile.txt...\n", err);
+ /* there is not return because I want to close the file! */
+ }
+
+ /* Close the file */
+ DOS_fclose(f);
+}
+
+
Index: branches/pj/dosfs/myfile.txt
===================================================================
--- branches/pj/dosfs/myfile.txt (nonexistent)
+++ branches/pj/dosfs/myfile.txt (revision 1085)
@@ -0,0 +1,3 @@
+0.2.4.6.8.0.2.4.6.8.0.2.4.6.8.0.2.4.6.8.
+This is the myfile.txt file...
+
Index: branches/pj/dosfs/initfile.c
===================================================================
--- branches/pj/dosfs/initfile.c (nonexistent)
+++ branches/pj/dosfs/initfile.c (revision 1085)
@@ -0,0 +1,91 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and Gabriele Bolognini
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+void read_myfile(void);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ /* If you need to interact with the DOS Filesystem and you use
+ the X eXtender, this is the better place where you can use
+ the DOS_fXXX functions...
+
+ WARNING: You can call these functions only when you are in
+ real mode!!!
+
+ The system is in real mode:
+ - into __kernel_register_levels__()
+ - into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT
+ */
+ read_myfile();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/dosfs/readme.txt
===================================================================
--- branches/pj/dosfs/readme.txt (nonexistent)
+++ branches/pj/dosfs/readme.txt (revision 1085)
@@ -0,0 +1,46 @@
+--------------------------------------
+DOS_fXXX Demo
+
+by
+
+Paolo Gai pj@sssup.it
+and
+Gabriele Bolognini gabrieleb@sssup.it
+2001
+
+--------------------------------------
+
+The DOS_fXXX functions provided into ll/i386/x-dos.h are a few
+shortcuts that can be used to call INT21's DOS calls.
+
+These functions can be used to read and write files before/after
+the kernel goes into i386 protected mode.
+
+THEY CANNOT BE USED IF YOU BOOT WITH GRUB.
+
+--------------------------------------
+
+The demo is composed by:
+
+MAKEFILE The makefile used to compile the application;
+ dosfs is the rule to compile the application
+README.TXT This file
+INITFILE.C The init file (only RR)
+DOSFS.C The DOS_fread and DOS_fwrite demo
+
+--------------------------------------
+
+The demo works as follows:
+- Into __kernel_register_levels__() the demo reads up to 1000 bytes from
+ myfile.txt
+- Then, into the main() function it prints the contents of the buffer at
+ screen
+- Finally, at the end of the system it writes a file called myfile.out
+ with up to 30 of the first bytes of the buffer
+
+The demo should work on any processor speed, and does not use keyboard or
+graphics.
+
+Bug: at the moment (01 Jun 2001) sometimes the demo hangs when using
+the one-shot timer.
+
Index: branches/pj/dosfs/makefile
===================================================================
--- branches/pj/dosfs/makefile (nonexistent)
+++ branches/pj/dosfs/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= dosfs
+
+include $(BASE)/config/example.mk
+
+dosfs:
+ make -f $(SUBMAKE) APP=dosfs INIT= OTHEROBJS="initfile.o" OTHERINCL=
+
Index: branches/pj/soccer/soccer.c
===================================================================
--- branches/pj/soccer/soccer.c (nonexistent)
+++ branches/pj/soccer/soccer.c (revision 1085)
@@ -0,0 +1,1248 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: soccer.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+/*--------------------------------------------------------------*/
+/* */
+/* S.Ha.R.K. SOCCER SIMULATOR 2001 */
+/* */
+/* */
+/*Autori: Merli Andrea */
+/* Zucchetti Alessandro */
+/*--------------------------------------------------------------*/
+
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <math.h>
+#include <modules/cabs.h>
+#include <ll/sys/types.h>
+#include "images.h"
+#include "position.h"
+#include "iniziali.h"
+#include "calc.h"
+#include "calc2.h"
+#include "stadio.h"
+
+struct target{
+int x;
+int y;
+};
+
+void draw_calc(int x, int y, int c,int f); /*disegna i calciatori*/
+void draw_ball(int c); /*disegna la palla*/
+void draw_port(int c,int p,int yp,int xp); /*disegna i portieri*/
+void init_calc(); /*carica i task calc*/
+void init_position(int num,int *ox,int *oy); /*inizializza la posizione dei calciatori*/
+void init_calc_area(int i,int *x_min,int *x_max,int *y_min,int *y_max); /*inizializza la zona di campo die calciatori*/
+void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min);/*seleziona l'obietivo dei calciatori*/
+void collision_detection(int i);/*gestisce le collisioni tra i calciatori*/
+int get_direction(int x,int y,int x2, int y2);
+void init_portiere(); /*carica i task portiere*/
+void init_ball(); /*carica il task ball*/
+void act_goal(); /*carica il task gol*/
+void draw_goal(); /*gestisce il tabellone facendo apparire la scritta GOAL!!*/
+void disegna_campo(); /*disegna il campo di gioco*/
+int yportiere(int y1, int y2);
+int xportiere(int x1, int x2);
+int goal_behaviour(int f); /*gestisce gli eventi in occasione di un gol*/
+int rigore=0;
+float t;
+double tick = 1.0; /* system tick = 1 ms */
+int xb=300,yb=300,xob=300,yob=300; /* coordinate globali della palla*/
+struct position pos_calc[MAX_P+2];
+PID pid_calc,pid_calc2,pid_ball,pid_port,pid_gol;
+sem_t mutex,mutex2;
+CAB cbi[4];
+
+
+/*--------------------------------------------------------------*/
+TASK ball(void *arg)
+{
+float dx=0, dy=0;//,df=0,dg=0;
+float acc =0.0; /*accelerazione*/
+float x; /*spostamento*/
+int g=10; /*accelerazione di gravit…*/
+float cattr=0.05; /*coeff di attrito tra palla e campo*/
+int col=1000;
+int ij=0;
+int r1=0,r2=0; /*gol segnati*/
+char tetaa[15];
+double r; /*angolo in radianti*/
+int flag =0; /*variabile generatrice di eventi*/
+int outy,outx; /*variabile per rilevare il rimbalzo della palla*/
+float vel1=0.0,vel2=0.0; /*variabili di velocita*/
+float tau = 1.0; /*tempo base*/
+char *m; /*modo*/
+char *a; /*angolo*/
+char *s; /*speed*/
+char modo;
+char *o; /*azione*/
+char azione;
+int teta=0;
+char velocita;
+char mode;
+ ij=0;
+ m = cab_getmes(cbi[0]);
+ mode = *m;
+ cab_unget(cbi[0],m);
+ if(mode==NO_BALL_MODE){
+ xb = xob =(XMIN+XMAX)/2;
+ yb = yob =(YMIN+YMAX)/2;
+ }
+ if(mode ==PENALTY_MODE_BLUE){
+
+ xb=700;
+ yb=(YMIN+YMAX)/2;
+ }
+ if(mode == PENALTY_MODE_WHITE){
+ xb=100;
+ yb=(YMIN+YMAX)/2;
+ }
+
+ sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
+ grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
+/***************************************************************************/
+ while (1) { //WHILE(1);
+ m = cab_getmes(cbi[0]);
+ mode = *m;
+ cab_unget(cbi[0],m);
+ /*posiziono la palla sul dischetto del rigore*/
+ if(mode ==PENALTY_MODE_BLUE){
+ xb=700;
+ yb=(YMIN+YMAX)/2;
+ }
+ if(mode == PENALTY_MODE_WHITE){
+ xb=100;
+ yb=(YMIN+YMAX)/2;
+ }
+ /*se rigore=NO_PENALTY si calcolano le coordinate della palla
+ in base alla velocit… e alla direzione del tiro*/
+ if(rigore ==NO_PENALTY){
+ a = cab_getmes(cbi[1]); /*direzione*/
+ cab_unget(cbi[1],a);
+ s = cab_getmes(cbi[2]); /*velocit…*/
+ velocita = *s;
+ cab_unget(cbi[2],s);
+ acc = (float)cattr * g;
+ r = (double)(36*(*a)/12) * PI / 180.;
+ if(mode==PASS_MODE){
+ vel1= velocita;
+ }
+ vel2 = vel1 - acc*tau;
+ if(vel2>0){
+ x = vel1 *tau -0.5*acc*tau*tau;
+ dx = (float)(x * cos(r));
+ dy = (float)(x * sin(r));
+ xb += dx;
+ yb += dy;
+ ij++;
+ outx = (xb > XMAX-2) || (xb < XMIN+2);
+ outy = (yb > YMAX-6) || (yb < YMIN+6);
+
+ if (outx || outy) {
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
+ dx=0;
+ dy=0;
+ }
+ xb = xb - dx;
+ yb = yb - dy;
+ if (outx) teta = 60 - (*a);
+ if (outy) teta = 120-(*a);
+ if (teta > 120) teta -= 120;
+ if (teta < 0) teta += 120;
+ *a =(char)teta;
+ r = (double)(36*(*a)/12) * PI / 180.;
+ dx = (float)(x * cos(r));
+ dy = (float)(x * sin(r));
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
+ dx=0;
+ dy=0;
+ }
+ xb += dx;
+ yb += dy;
+ }
+ modo = NO_BALL_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+
+ vel1 = vel2;
+ }
+ if (yb< YMIN+5) yb = yb+10;
+ if(xb< XMIN+5) xb = xb +10;
+ /*se c'Š un gol*/
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)&&((xb<=XMIN+7)||
+ (xb >=XMAX-7))){
+ /*aggiorno i risultati*/
+ if(xb<XMIN+50) r2++;
+ else r1++;
+ /*assegno alle variabili i valori di riposo*/
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ teta=0;
+ velocita=0;
+ flag =1;
+ }
+ /* in base al valore di flag modifico il tabellone*/
+ flag = goal_behaviour(flag);
+ /*scrivo il nuovo risultato nel tabellone*/
+ if (flag == 80){
+ sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
+ grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
+ flag =0;
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT; /*nessuna azione*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ modo = NO_BALL_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ }
+
+ }//fine if(rigore==NO_PENALTY)
+ draw_ball(0);
+ draw_ball(col);
+ xob = xb; yob = yb;
+
+ task_endcycle();
+ }
+
+}
+
+
+/*--------------------------------------------------------------*/
+
+
+
+/******************************************************************/
+
+TASK calc(void *arg){
+
+struct target obj;
+int ox=200, oy=200;
+int alpha=0;
+int teta;
+int col=0;
+char speed;
+char *s;
+char modo;
+char *m;
+char angolo;
+char *a;
+int i = (int)arg;
+int x_min=0,y_min=0;
+int x_max=0,y_max=0;
+/*Posiziono i calciatori nel punto iniziale*/
+
+ init_position(i,&ox,&oy);
+
+
+ /*Definisco l'area di gioco del calciatore basandomi sul suo PID*/
+
+ init_calc_area(i,&x_min,&x_max,&y_min,&y_max);
+
+while (1) {
+ m = cab_getmes(cbi[0]);
+ modo = *m;
+ cab_unget(cbi[0],m);
+
+ /*Individua l'obiettivo del calciatore a seconda del modo e del */
+ /*ruolo in PENALTY_MODE un calciatore va sul pallone gli altri */
+ /*ai lati del campo */
+ /*in NO_BALL_MODE l'obiettivo Š la palla se essa Š */
+ /*nell'area definita dalla funzione init_calc_area(..) */
+ /*altrimenti Š la posizione iniziale definita con init_position(.)*/
+
+
+ get_target(modo,i,&obj,x_max,x_min,y_max,y_min);
+
+ /*se raggiungo l'obbiettivo mi fermo*/
+ if(obj.x==pos_calc[i].x) pos_calc[i].dx=0;
+ if(obj.y==pos_calc[i].y) pos_calc[i].dy=0;
+
+ /*direzione tra il calciatore e l'obiettivo*/
+
+ alpha= get_direction(pos_calc[i].x,pos_calc[i].y,obj.x,obj.y);
+
+ /*direzione di corsa iniziale*/
+
+ pos_calc[i].dy = -VEL*sin((alpha*PI)/180);
+ pos_calc[i].dx = VEL*cos((alpha*PI)/180);
+
+
+ /*Per evitare che il calciatore corra prima dell'inizio della
+ partita gli impongo di non muoversi in posizione iniziale*/
+
+ if((obj.x==300)&&(obj.y==300)) {
+ pos_calc[i].dx=0;
+ pos_calc[i].dy=0;
+ }
+ /*velocità di corsa*/
+
+ pos_calc[i].x+=pos_calc[i].dx;
+ pos_calc[i].y+=pos_calc[i].dy;
+
+ /*verifico se mi trovo in una situazione di collisione con */
+ /*un altro calciatore */
+
+ collision_detection(i);
+
+
+
+ /*se il calciatore arriva sulla palla tira*/
+ if((modo==NO_BALL_MODE)||(i==7)||(i==2))
+ if(((pos_calc[i].x>=xb-27)&&(pos_calc[i].x<=xb+27))&&((pos_calc[i].y>=yb-27)&&(pos_calc[i].y<=yb+27)))
+ {
+
+ if((i==7)||(i==2)) rigore =NO_PENALTY;
+ modo = PASS_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ if(i<5){
+ a = cab_reserve(cbi[1]);
+ teta =(rand()%(90) + 135 );
+ if(teta >360) teta -= 360;
+ if (teta<0) teta += 360;
+ angolo = (char)(teta/3);
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ }
+ if(i>4){
+ a = cab_reserve(cbi[1]);
+ teta =(rand()%(90) -45);
+ if(teta >360) teta -= 360;
+ if (teta<0) teta += 360;
+ teta = (teta/3);
+ *a = teta;//angolo;
+ cab_putmes(cbi[1],a);
+ }
+ s = cab_reserve(cbi[2]);
+ speed=16;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+
+ }
+
+
+
+ draw_calc(ox, oy, CANC,0);
+
+ /*Disegna l'omino voltato nella direzione della palla*/
+ if(i<5){
+ DIREZ(alpha,col,158,203, RLEFT,pos_calc[i].x,pos_calc[i].y);/*runleft*/
+ DIREZ(alpha,col,249,292, RDOWN,pos_calc[i].x,pos_calc[i].y);/*rundown*/
+ DIREZ(alpha,col, 68,113, RUP,pos_calc[i].x,pos_calc[i].y);/*runup*/
+ DIREZ(alpha,col, 0, 23,RRIGHT,pos_calc[i].x,pos_calc[i].y);/*runright*/
+ DIREZ(alpha,col,337,360,RRIGHT,pos_calc[i].x,pos_calc[i].y);
+ DIREZ(alpha,col, 23, 68, RRUP,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
+ DIREZ(alpha,col,113,158, RLUP,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
+ DIREZ(alpha,col,203,249, RLDW,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
+ DIREZ(alpha,col,292,337, RRDW,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
+ }
+
+ if(i>4){
+
+ DIREZ(alpha,col,158,203, RLEFT2,pos_calc[i].x,pos_calc[i].y);/*runleft*/
+ DIREZ(alpha,col,249,292, RDOWN2,pos_calc[i].x,pos_calc[i].y);/*rundown*/
+ DIREZ(alpha,col, 68,113, RUP2,pos_calc[i].x,pos_calc[i].y);/*runup*/
+ DIREZ(alpha,col, 0, 23,RRIGHT2,pos_calc[i].x,pos_calc[i].y);/*runright*/
+ DIREZ(alpha,col,337,360,RRIGHT2,pos_calc[i].x,pos_calc[i].y);
+ DIREZ(alpha,col, 23, 68, RRUP2,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
+ DIREZ(alpha,col,113,158, RLUP2,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
+ DIREZ(alpha,col,203,249, RLDW2,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
+ DIREZ(alpha,col,292,337, RRDW2,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
+ }
+
+
+ ox =pos_calc[i].x; oy = pos_calc[i].y;
+
+ task_endcycle();
+ }
+}
+/****************************************************************/
+TASK gol(void *arg)
+{
+ while(1){
+ draw_goal();
+ task_endcycle();
+ }
+}
+/****************************************************************/
+TASK portiere(void *arg)
+{
+int yp,yp1,yp0,ypo_0=(YMAX+YMIN)/2,ypo_1=(YMAX+YMIN)/2;
+int xp0,xp1,xpo_0,xpo_1,xo0,xo1;
+int np= (int)arg;
+char speed;
+char *s;
+char modo;
+char *m;
+char angolo;
+char *a;
+
+ yp = (YMIN+YMAX)/2; /* y di attesa*/
+ yp0 = (YMIN+YMAX)/2;
+ yp1 = (YMIN+YMAX)/2;
+ xp0 = xpo_0 = XMIN+3; /* xp ascissa attuale portiere, xpo ascissa vecchia posizione portiere*/
+ xp1 = xpo_1 = XMAX-30;
+ xo0 = XMIN+3; /* x di attesa*/
+ xo1 = XMAX-30; /* x di attesa*/
+ draw_port(1,np,yp,xo0);
+ draw_port(1,np,yp,xo1);
+
+ while(1){
+ m = cab_getmes(cbi[0]);
+ modo = *m;
+ cab_unget(cbi[0],m);
+ /*in base alla posizione della palla si calcola la posizione del portiere*/
+ if ((np==0) && (xb < (XMIN+XMAX)/2) &&(xb > XMIN+150)){
+ yp0 = yportiere(yb,yp0);
+ xp0 = xportiere(xo0,xp0);
+ }
+ if ((np==0) &&(xb <= XMIN+150)){
+ yp0 = yportiere(yb,yp0);
+ xp0= xportiere(xb,xp0);
+ }
+ if ((np==0) && (xb > (XMIN+XMAX)/2)){
+ yp0 = yportiere(yp,yp0);
+ xp0 = xportiere(xo0,xp0);
+ }
+ /*il portiere non esce oltre questi limiti*/
+ if ((yp0< (YMIN+YMAX)/2-100)|| (yp0>(YMIN+YMAX)/2+100))
+ yp0 = ypo_0;
+ if(xp0> XMIN+150)
+ xp0 =xpo_0;
+
+ pos_calc[10].x = xp0;
+ pos_calc[10].y = yp0;
+
+ /*in base alla posizione della palla si calcola la posizione del portiere*/
+ if ((np==1) && (xb > (XMIN+XMAX)/2) && (xb< XMAX-150)){
+ yp1 = yportiere(yb,yp1);
+ xp1 = xportiere(xo1,xp1);
+ }
+ if ((np==1) && (xb >= XMAX-150)){
+ yp1 = yportiere(yb,yp1);
+ xp1 = xportiere(xb,xp1);
+ }
+ if ((np==1) && (xb < (XMIN+XMAX)/2)){
+ yp1 = yportiere(yp,yp1);
+ xp1 = xportiere(xo1,xp1);
+ }
+ /*il portiere non esce oltre questi limiti*/
+ if ((yp1< (YMIN+YMAX)/2-100)|| (yp1>(YMIN+YMAX)/2+100))
+ yp1 =ypo_1;
+ if(xp1 < XMAX-150)
+ xp1 =xpo_1;
+
+ pos_calc[11].x = xp1;
+ pos_calc[11].y = yp1;
+
+ /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
+ if (rigore ==PENALTY) xp0= XMIN+3;
+
+ if ((np==0)){
+ draw_port(0,np,ypo_0,xpo_0);
+ draw_port(1,np,yp0,xp0);
+ ypo_0 = yp0;
+ xpo_0 =xp0;
+ }
+
+ /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
+ if(rigore ==PENALTY) xp1= XMAX-30;
+
+ if((np==1)){
+ draw_port(0,np,ypo_1,xpo_1);
+ draw_port(1,np,yp1,xp1);
+ ypo_1 = yp1;
+ xpo_1 = xp1;
+ }
+
+ /*se para rinvia immediatamente*/
+ if( (yp0 >=yb-5) && (yp0<yb+20) && ((xb<=xp0+20)&&(xb>=xp0-30))){
+ m = cab_reserve(cbi[0]);
+ modo = PASS_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =0;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=20;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ }
+ /*se para rinvia immediatamente*/
+ if((yp1 >=yb-5) && (yp1<yb+20) && (xb<=xp1+20)&&(xb>= xp1-30) ){
+ m = cab_reserve(cbi[0]);
+ modo = PASS_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =60;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=20;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ }
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* This function is called when the system exits */
+void byebye(void *arg)
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/****************************** MAIN ******************************/
+
+int main(int argc, char **argv)
+{
+
+
+ char c; /* character from keyboard */
+ int z=0;
+ int p=0;
+ int ij=0;
+ char modo;
+ char *m;
+ char *s;
+ char speed;
+ char *a;
+ char angolo;
+ char *o;
+ char azione;
+
+
+ TIME seme; /* used to init the random seed */
+
+ /* Set the exception handler */
+ set_exchandler_grx();
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(ORI_RES,VER_RES,COL_DEP) < 0) {
+ kern_printf("GRX Err\n");
+ sys_abort(1);
+ }
+ kern_printf("Video card ok!\n");
+ cbi[1] = cab_create("direzione",10,15);
+ cbi[0] = cab_create("modo",4,15);
+ cbi[2] = cab_create("velocita",10,15);
+ cbi[3] = cab_create("azione",3,3);
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =0;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=0;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+
+ /* The scenario */
+
+ grx_box(0,0,ORI_RES,VER_RES,0);
+ disegna_campo();
+ for(p=0;p<scale_width;p++)
+ for(z=0;z<scale_height;z++){
+ grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ }
+ for(p=0;p<faro_width;p++)
+ for(z=0;z<faro_height;z++){
+ grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
+ grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
+ }
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ /* The program waits a space to create a calc */
+ c = keyb_getch(BLOCK);
+
+ /* randomize!!!!*/
+ seme = sys_gettime(NULL);
+ srand(seme);
+
+ do {
+ if ((c == ' ') &&(ij==0)) {
+ init_ball();
+ init_calc();
+ init_portiere();
+ ij++;
+ }
+ if ((c== 'w')){m = cab_reserve(cbi[0]);
+ modo = PENALTY_MODE_WHITE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ rigore =PENALTY; }
+ if ((c== 'e')){m = cab_reserve(cbi[0]);
+ modo = PENALTY_MODE_BLUE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ rigore =PENALTY; }
+ if ((c == 'k')) {
+ group_kill(GROUP_PLAY);
+ group_kill(GROUP_SOFT);
+ group_kill(GROUP_BALL);
+ ij=0;
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ disegna_campo();
+ for(p=0;p<scale_width;p++)
+ for(z=0;z<scale_height;z++){
+ grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ }
+ for(p=0;p<faro_width;p++)
+ for(z=0;z<faro_height;z++){
+ grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
+ grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
+ }
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ xb=(int)(XMAX-XMIN)/2;
+ yb=(int)(YMIN+YMAX)/2;
+ }
+ c = keyb_getch(BLOCK);
+ } while (c != ESC);
+
+
+
+ sys_end();
+
+ return 0;
+}
+
+/*--------------------------------------------------------------*/
+void draw_calc(int x, int y, int c,int f)
+{
+ int i,j;/*needed in the macro*/
+ sem_wait(&mutex);
+ if(c==CANC){
+
+ grx_box(x, y,x+27,y+27,SFONDO);
+ if((x>(XMIN+XMAX)/2-27) && (x<(XMIN+XMAX)/2+27)){
+ grx_line(XMIN+1,YMIN+1,XMAX-1,YMIN+1,rgb16(255,255,255));
+ grx_line(XMIN+1,YMAX-1,XMAX-1,YMAX-1,rgb16(255,255,255));
+ grx_line(XMIN+1,YMIN+1,XMIN+1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
+ grx_line(XMIN+1,(YMIN+YMAX)/2+50,XMIN+1,YMAX-1,rgb16(255,255,255));
+ grx_line(XMAX-1,YMIN+1,XMAX-1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
+ grx_line(XMAX-1,(YMIN+YMAX)/2+50,XMAX-1,YMAX-1,rgb16(255,255,255));
+ grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
+ grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN+1,(YMIN+YMAX)/2-50,XMIN+1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
+ grx_line(XMAX-1,(YMIN+YMAX)/2-50,XMAX-1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ }
+ else
+ if(c==RLEFT)
+ DIRDRAW(x,y,((unsigned char)runup_data[i*27+j]));
+ if(c==RLEFT+1)
+ DIRDRAW(x,y,((unsigned char)runup2_data[i*27+j]));
+ if(c==RDOWN)
+ DIRDRAW(x,y,((unsigned char)rundes2_data[i*27+j]));
+ if(c==RDOWN+1)
+ DIRDRAW(x,y,((unsigned char)rundes_data[i*27+j]));
+ if(c==RUP)
+ DIRDRAW(x,y,((unsigned char)runleft2_data[i*27+j]));
+ if(c==RUP+1)
+ DIRDRAW(x,y,((unsigned char)runleft_data[i*27+j]));
+ if(c==RRIGHT)
+ DIRDRAW(x,y,((unsigned char)rundown2_data[i*27+j]));
+ if(c==RRIGHT+1)
+ DIRDRAW(x,y,((unsigned char)rundown_data[i*27+j]));
+ if(c==RRUP)
+ DIRDRAW(x,y,((unsigned char)runld2_data[i*27+j]));
+ if(c==RRUP+1)
+ DIRDRAW(x,y,((unsigned char)runld_data[i*27+j]));
+ if(c==RLUP)
+ DIRDRAW(x,y,((unsigned char)runlu2_data[i*27+j]));
+ if(c==RLUP+1)
+ DIRDRAW(x,y,((unsigned char)runlu_data[i*27+j]));
+ if(c==RLDW)
+ DIRDRAW(x,y,((unsigned char)runru2_data[i*27+j]));
+ if(c==RLDW+1)
+ DIRDRAW(x,y,((unsigned char)runru_data[i*27+j]));
+ if(c==RRDW)
+ DIRDRAW(x,y,((unsigned char)runrd2_data[i*27+j]));
+ if(c==RRDW+1)
+ DIRDRAW(x,y,((unsigned char)runrd_data[i*27+j]));
+/**********************************************************************/
+ if(c==RLEFT2)
+ DIRDRAW(x,y,((unsigned char)B_runup_data[i*27+j]));
+ if(c==RLEFT2+1)
+ DIRDRAW(x,y,((unsigned char)B_runup2_data[i*27+j]));
+ if(c==RDOWN2)
+ DIRDRAW(x,y,((unsigned char)B_rundes2_data[i*27+j]));
+ if(c==RDOWN2+1)
+ DIRDRAW(x,y,((unsigned char)B_rundes_data[i*27+j]));
+ if(c==RUP2)
+ DIRDRAW(x,y,((unsigned char)B_runleft2_data[i*27+j]));
+ if(c==RUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runleft_data[i*27+j]));
+ if(c==RRIGHT2)
+ DIRDRAW(x,y,((unsigned char)B_rundown2_data[i*27+j]));
+ if(c==RRIGHT2+1)
+ DIRDRAW(x,y,((unsigned char)B_rundown_data[i*27+j]));
+ if(c==RRUP2)
+ DIRDRAW(x,y,((unsigned char)B_runld2_data[i*27+j]));
+ if(c==RRUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runld_data[i*27+j]));
+ if(c==RLUP2)
+ DIRDRAW(x,y,((unsigned char)B_runlu2_data[i*27+j]));
+ if(c==RLUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runlu_data[i*27+j]));
+ if(c==RLDW2)
+ DIRDRAW(x,y,((unsigned char)B_runru2_data[i*27+j]));
+ if(c==RLDW2+1)
+ DIRDRAW(x,y,((unsigned char)B_runru_data[i*27+j]));
+ if(c==RRDW2)
+ DIRDRAW(x,y,((unsigned char)B_runrd2_data[i*27+j]));
+ if(c==RRDW2+1)
+ DIRDRAW(x,y,((unsigned char)B_runrd_data[i*27+j]));
+ sem_post(&mutex);
+}
+/*--------------------------------------------------------------*/
+void draw_ball(int c)
+{
+ sem_wait(&mutex);
+ if(c==0)
+ grx_box(xob, yob,xob+5,yob+5,SFONDO);
+ else grx_putimage(xb, yb,xb+5,yb+5,pallone);
+ sem_post(&mutex);
+}
+void draw_port(int c,int p,int yp,int xp)
+{
+ int i,j;
+ sem_wait(&mutex);
+ if (c==0){
+ if(p==0){
+ /*ridisegna l'area*/
+ grx_box(xp,yp-15,xp+30,yp+25,SFONDO);
+ grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ if(p==1){
+ /*ridisegna l'area*/
+ grx_box(xp,yp-15,xp+27,yp+25,SFONDO);
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ }
+ else{
+ if(p==0)
+ DIRDRAW(xp,yp,((unsigned char)portsx_data[i*27+j]));
+ if(p==1)
+ DIRDRAW(xp,yp,((unsigned char)portdx_data[i*27+j]));
+ }
+ sem_post(&mutex);
+}
+void init_ball(){
+ HARD_TASK_MODEL m_ball;
+ hard_task_default_model(m_ball);
+ hard_task_def_ctrl_jet (m_ball);
+ hard_task_def_arg (m_ball, (void *)0);
+ hard_task_def_wcet (m_ball, BALL_WCET);
+ hard_task_def_mit (m_ball, PERIOD_BALL);
+ hard_task_def_group (m_ball, GROUP_BALL);
+ hard_task_def_usemath (m_ball);
+ pid_ball = task_create("ball", ball, &m_ball, NULL);
+ if (pid_ball == NIL) {
+ grx_close();
+ perror("Could not create task <ball>");
+ sys_abort(1);
+ }
+
+ task_activate(pid_ball);
+}
+void init_calc(){
+ HARD_TASK_MODEL m_calc;
+ int i;
+ disegna_campo();
+ for(i=0;i<MAX_P;i++){
+ hard_task_default_model(m_calc);
+ hard_task_def_ctrl_jet (m_calc);
+ hard_task_def_arg (m_calc, (void *)i);
+ hard_task_def_wcet (m_calc, CALC_WCET);
+ hard_task_def_mit (m_calc, PERIOD_CALC);
+ hard_task_def_group (m_calc, GROUP_PLAY);
+ hard_task_def_usemath (m_calc);
+ pid_calc = task_create("calc", calc, &m_calc, NULL);
+ if (pid_calc == NIL) {
+ grx_close();
+ perror("Could not create task <calc>");
+ sys_abort(1);
+ }
+ task_activate(pid_calc);
+ }
+ }
+void act_goal(){
+
+
+ SOFT_TASK_MODEL m_goal;
+ soft_task_default_model(m_goal);
+ soft_task_def_arg (m_goal,(void*)0);
+ soft_task_def_met (m_goal, 1000);
+ soft_task_def_level (m_goal,1);
+ soft_task_def_ctrl_jet (m_goal);
+ soft_task_def_period (m_goal, 1200000);
+ soft_task_def_group (m_goal, GROUP_SOFT);
+ soft_task_def_usemath (m_goal);
+ soft_task_def_aperiodic(m_goal);
+
+ pid_gol = task_create("gol", gol, &m_goal, NULL);
+ if (pid_gol == NIL) {
+ grx_close();
+ perror("Could not create task <port>");
+ sys_abort(1);
+ }
+ task_activate(pid_gol);
+ }
+void init_portiere(){
+ HARD_TASK_MODEL m_port;
+ int g;
+ for(g=0;g<2;g++){
+ hard_task_default_model(m_port);
+ hard_task_def_arg (m_port, (void *)g);
+ hard_task_def_wcet (m_port, PORT_WCET);
+ hard_task_def_mit (m_port, PERIOD_PORT);
+ hard_task_def_group (m_port, GROUP_SOFT);
+ hard_task_def_usemath (m_port);
+ pid_port = task_create("portiere", portiere, &m_port, NULL);
+ if (pid_port == NIL) {
+ grx_close();
+ perror("Could not create task <port>");
+ sys_abort(1);
+ }
+ task_activate(pid_port);
+ }
+
+ }
+void draw_goal(){
+ int p,z;
+ char *m;
+ char modo;
+ char *o;
+ char azione;
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ o = cab_getmes(cbi[3]);
+ azione = *o;
+ cab_unget(cbi[3],o);
+
+ /*scritta GOAL!!*/
+ if(azione == GOAL_ACT){
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)goal1_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ o = cab_reserve(cbi[3]);
+ azione = 0;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ }
+
+ /*risistema il menu sul tabellone*/
+ if (azione == MENU_ACT){
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ }
+}
+
+/*calcola la y del portiere in base alla yi in ingresso*/
+int yportiere(int yi,int yf){
+ int speedy =3;
+ int dy=0;
+ int yp;
+ /*Se sto per raggiungere la palla rallento*/
+ if(abs(yi-yf)<VEL) speedy=1;
+ /*se raggiungo la palla mi fermo*/
+ if(yi==yf)dy=0;
+ /*se palla in basso*/
+ if(yi>yf) dy= speedy;
+ /*se palla in alto*/
+ if(yi<yf) dy=-speedy;
+ yp =yf+dy;
+ return(yp);
+}
+/*calcola la x del portiere in base alla xi in ingresso*/
+int xportiere(int xi, int xf){
+ int speedx=3;
+ int dx=0;
+ int xp;
+ if(abs(xi-xf)<VEL) speedx=1;
+ if(xi==xf)dx=0;
+ if(xi>xf) dx= speedx;
+ if(xi<xf) dx=-speedx;
+ xp = xf +dx;
+ return(xp);
+}
+/*disegna il campo di gioco*/
+void disegna_campo(){
+ //grx_box(0,0,ORI_RES,VER_RES,0);
+ grx_box(XMIN, YMIN, XMAX, YMAX, SFONDO);
+ grx_rect(XMIN+1, YMIN+1, XMAX-1, YMAX-1, rgb16(255,255,255));
+ grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
+ grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
+ grx_rect(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_rect(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_rect(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_rect(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+}
+void init_position(int num,int *ox,int *oy)
+{
+ if(num<5){
+ pos_calc[num].x = *ox = initial_calc_position[num].x+35;
+ pos_calc[num].y = *oy = initial_calc_position[num].y;
+ }
+ if(num==2){
+ pos_calc[num].x = *ox = initial_calc_position[num].x+100;
+ pos_calc[num].y = *oy = initial_calc_position[num].y;
+ }
+ if(num>4){
+ pos_calc[num].x = *ox = initial_calc_position[num-5].x;
+ pos_calc[num].y = *oy = initial_calc_position[num-5].y+35;
+ }
+ if(num==7){
+ pos_calc[num].x = *ox = initial_calc_position[num-5].x-100;
+ pos_calc[num].y = *oy = initial_calc_position[num-5].y;
+ }
+
+}
+void init_calc_area(int num,int *xmin,int *xmax,int *ymin,int *ymax){
+
+
+ switch(num)
+ {
+ case 0: /*attaccante bianchi*/
+ case 5: /*difensore blu*/
+ {
+ *xmin = XMIN;
+ *ymin = YMIN;
+ *xmax = 255;
+ *ymax = 305;
+ }
+ break;
+ case 1: /*attaccante bianchi*/
+ case 6: /*difensore blu*/
+ {
+ *xmin = XMIN;
+ *ymin = 295;
+ *xmax = 255;
+ *ymax = YMAX;
+ }
+ break;
+ case 2: /*centrocampisti*/
+ case 7:
+ {
+ *xmin = 255;
+ *ymin = YMIN;
+ *xmax = 525;
+ *ymax = YMAX;
+ } break;
+ case 3: /*attaccante blu*/
+ case 8: /*difensore bianco*/
+ {
+ *xmin = 525;
+ *ymin = YMIN;
+ *xmax = XMAX;
+ *ymax = 305;
+ }
+ break;
+ case 4: /*attaccante blu*/
+ case 9: /*difensore bianco*/
+ {
+ *xmin = 505;
+ *ymin = 305;
+ *xmax = XMAX;
+ *ymax = YMAX;
+ }
+ break;
+ default:
+ break;
+ }
+}
+void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min){
+
+
+
+ if((modo==PENALTY_MODE_WHITE)||(modo==PENALTY_MODE_BLUE)){
+
+
+
+ if((i<5)){
+ obj->x = (XMAX)-100-50*i;
+ if(pos_calc[i].y>(YMAX+YMIN)/2)
+ obj->y = YMAX-60;
+ if(pos_calc[i].y<(YMAX+YMIN)/2)
+ obj->y = YMIN+60;
+ if(modo==PENALTY_MODE_WHITE){
+ if((i==2)){
+ obj->x = xb;
+ obj->y = yb;
+ }
+ }
+ }
+ if((i>4)){
+ obj->x = (XMIN)+100+50*i;
+ if(pos_calc[i].y>(YMAX+YMIN)/2)
+ obj->y = YMAX-60;
+ if(pos_calc[i].y<(YMAX+YMIN)/2)
+ obj->y = YMIN+60;
+ if(modo==PENALTY_MODE_BLUE){
+ if((i==7)){
+ obj->x = xb;
+ obj->y = yb;
+ }
+ }
+
+ }
+ }
+
+ if(modo==NO_BALL_MODE)
+ {
+
+ /*Valutazione se la palla sia in una zona di interesse per il */
+ /*calciatore */
+
+ if((xb>x_max)||(xb<x_min)||(yb>y_max)||(yb<y_min))
+ {
+ if(i<5)
+ {
+ obj->x=initial_calc_position[i].x;
+ obj->y=initial_calc_position[i].y;
+ }
+ if(i>4)
+ {
+ obj->x=initial_calc_position[i-5].x;
+ obj->y=initial_calc_position[i-5].y;
+ }
+ }
+ else
+ {
+ obj->x=xb;
+ obj->y=yb;
+ }
+ }
+
+
+
+
+}
+int get_direction(int x,int y,int x2,int y2){
+
+int ang=0;
+ if((abs(x-x2) !=0)){
+ if((x>x2)&&(y<=y2))
+ ang = 180+
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x<x2)&&(y<y2))
+ ang = 360-
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x<x2)&&(y>y2))
+ ang =
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x>x2)&&(y>y2))
+ ang = 180-
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ }
+
+return ang;
+
+}
+
+void collision_detection(int i){
+
+int j;
+
+
+for(j=0;j<MAX_P+2;j++){
+
+ if(i!=j){
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y && pos_calc[i].y>pos_calc[j].y-27)
+ {
+ pos_calc[i].y=pos_calc[j].y-27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y-27)
+ {
+ pos_calc[i].x=pos_calc[j].x-27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
+ {
+ pos_calc[i].y=pos_calc[j].y+27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
+ {
+ pos_calc[i].x=pos_calc[j].x+27;
+ }
+ }
+ }
+
+ /*Per impedire un calciatore esca dal campo*/
+
+ if(pos_calc[i].x>=XMAX-(pos_calc[i].dx+1)) pos_calc[i].x-=(pos_calc[i].dx+1);
+ if(pos_calc[i].x<=XMIN+(pos_calc[i].dx+1)) pos_calc[i].x+=(pos_calc[i].dx+1);
+ if(pos_calc[i].y>=YMAX-(pos_calc[i].dy+1)) pos_calc[i].y-=(pos_calc[i].dy+1);
+ if(pos_calc[i].y<=YMIN+(pos_calc[i].dy+1)) pos_calc[i].y+=(pos_calc[i].dy+1);
+}
+
+int goal_behaviour(int flag){
+char *o;
+char azione;
+
+ if (flag !=0) {
+ flag++;
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ }
+ if (flag==20){
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ /*seleziono l'azione da compiere sul tabellone*/
+ o = cab_reserve(cbi[3]);
+ azione = GOAL_ACT; /*scritta GOAL!!*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ /*carico il task gol*/
+ act_goal();
+ }
+ if (flag==65){
+ o = cab_reserve(cbi[3]);
+ azione = MENU_ACT; /*sistema il menu su tabellone*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ /*carico il task gol*/
+ act_goal();
+ }
+
+ return(flag);
+}
+
Index: branches/pj/soccer/initfile.c
===================================================================
--- branches/pj/soccer/initfile.c (nonexistent)
+++ branches/pj/soccer/initfile.c (revision 1085)
@@ -0,0 +1,120 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+
+ System initialization file
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBS (Costant Bandwidth Server) level
+ a Dummy level
+
+ It can accept these task models:
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ SOFT_TASK_MODEL (met, period) at level 1
+ NRT_TASK_MODEL at level 2
+
+ This file is similar to the configuration of kernel/init/hartik3.c
+
+ TICK is set to 0 (one-shot timer is used)
+*/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ keyb_def_map(kparms,itaMap);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: branches/pj/soccer/calc.h
===================================================================
--- branches/pj/soccer/calc.h (nonexistent)
+++ branches/pj/soccer/calc.h (revision 1085)
@@ -0,0 +1,1017 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: calc.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
+
+//static unsigned int runup_width = 27;
+//static unsigned int runup_height = 27;
+
+
+/*Macro che disegan un calciatore che corre*/
+
+#define DIRDRAW(X,Y,D) \
+ for(i=0;i<27;i++)\
+ for(j=0;j<27;j++)\
+ grx_plot(X+i,Y+j,rgb16(cmap[D][0],cmap[D][1],cmap[D][2]));\
+ /* sprintf(a,"%d",f);\
+ grx_text(a,X+30,Y+30, rgb16(255,255,255), rgb16(0,0,0));*/
+/*Macro che calcola i parametri di draw_calc*/
+#define DIREZ(A,C,G,S,F,X,Y) \
+ if(col<12){\
+ if( (A<=S)&&(A>=G)){ \
+ if(C<=4) { \
+ draw_calc(X, Y, F,i); \
+ C++; \
+ } \
+ else if(C>4){ \
+ draw_calc(X,Y,F+1,i); \
+ C++; \
+ if(C==8)C=0; \
+ } \
+ }\
+ }
+
+/* Call this macro repeatedly. After each use, the pixel data can be extracted */
+
+#define HEADER_PIXEL(data,pixel) {\
+pixel[0] = runup_cmap[(unsigned char)data[0]][0]; \
+pixel[1] = runup_data_cmap[(unsigned char)data[0]][1]; \
+pixel[2] = runup_data_cmap[(unsigned char)data[0]][2]; \
+data ++; }
+
+static char cmap[256][3] = {
+ { 0, 0, 0},
+ { 0, 0, 64},
+ { 0, 0,128},
+ { 0, 0,255},
+ { 0, 32, 0},
+ { 0, 32, 64},
+ { 0, 32,128},
+ { 0, 32,255},
+ { 0, 64, 0},
+ { 0, 64, 64},
+ { 0, 64,128},
+ { 0, 64,255},
+ { 0, 96, 0},
+ { 0, 96, 64},
+ { 0, 96,128},
+ { 0, 96,255},
+ { 0,128, 0},
+ { 0,128, 64},
+ { 0,128,128},
+ { 0,128,255},
+ { 0,160, 0},
+ { 0,160, 64},
+ { 0,160,128},
+ { 0,160,255},
+ { 0,192, 0},
+ { 0,192, 64},
+ { 0,192,128},
+ { 0,192,255},
+ { 0,255, 0},
+ { 0,255, 64},
+ { 0,255,128},
+ { 0,255,255},
+ { 32, 0, 0},
+ { 32, 0, 64},
+ { 32, 0,128},
+ { 32, 0,255},
+ { 32, 32, 0},
+ { 32, 32, 64},
+ { 32, 32,128},
+ { 32, 32,255},
+ { 32, 64, 0},
+ { 32, 64, 64},
+ { 32, 64,128},
+ { 32, 64,255},
+ { 32, 96, 0},
+ { 32, 96, 64},
+ { 32, 96,128},
+ { 32, 96,255},
+ { 32,128, 0},
+ { 32,128, 64},
+ { 32,128,128},
+ { 32,128,255},
+ { 32,160, 0},
+ { 32,160, 64},
+ { 32,160,128},
+ { 32,160,255},
+ { 32,192, 0},
+ { 32,192, 64},
+ { 32,192,128},
+ { 32,192,255},
+ { 32,255, 0},
+ { 32,255, 64},
+ { 32,255,128},
+ { 32,255,255},
+ { 64, 0, 0},
+ { 64, 0, 64},
+ { 64, 0,128},
+ { 64, 0,255},
+ { 64, 32, 0},
+ { 64, 32, 64},
+ { 64, 32,128},
+ { 64, 32,255},
+ { 64, 64, 0},
+ { 64, 64, 64},
+ { 64, 64,128},
+ { 64, 64,255},
+ { 64, 96, 0},
+ { 64, 96, 64},
+ { 64, 96,128},
+ { 64, 96,255},
+ { 64,128, 0},
+ { 64,128, 64},
+ { 64,128,128},
+ { 64,128,255},
+ { 64,160, 0},
+ { 64,160, 64},
+ { 64,160,128},
+ { 64,160,255},
+ { 64,192, 0},
+ { 64,192, 64},
+ { 64,192,128},
+ { 64,192,255},
+ { 64,255, 0},
+ { 64,255, 64},
+ { 64,255,128},
+ { 64,255,255},
+ { 96, 0, 0},
+ { 96, 0, 64},
+ { 96, 0,128},
+ { 96, 0,255},
+ { 96, 32, 0},
+ { 96, 32, 64},
+ { 96, 32,128},
+ { 96, 32,255},
+ { 96, 64, 0},
+ { 96, 64, 64},
+ { 96, 64,128},
+ { 96, 64,255},
+ { 96, 96, 0},
+ { 96, 96, 64},
+ { 96, 96,128},
+ { 96, 96,255},
+ { 96,128, 0},
+ { 96,128, 64},
+ { 96,128,128},
+ { 96,128,255},
+ { 96,160, 0},
+ { 96,160, 64},
+ { 96,160,128},
+ { 96,160,255},
+ { 96,192, 0},
+ { 96,192, 64},
+ { 96,192,128},
+ { 96,192,255},
+ { 96,255, 0},
+ { 96,255, 64},
+ { 96,255,128},
+ { 96,255,255},
+ {128, 0, 0},
+ {128, 0, 64},
+ {128, 0,128},
+ {128, 0,255},
+ {128, 32, 0},
+ {128, 32, 64},
+ {128, 32,128},
+ {128, 32,255},
+ {128, 64, 0},
+ {128, 64, 64},
+ {128, 64,128},
+ {128, 64,255},
+ {128, 96, 0},
+ {128, 96, 64},
+ {128, 96,128},
+ {128, 96,255},
+ {128,128, 0},
+ {128,128, 64},
+ {128,128,128},
+ {128,128,255},
+ {128,160, 0},
+ {128,160, 64},
+ {128,160,128},
+ {128,160,255},
+ {128,192, 0},
+ {128,192, 64},
+ {128,192,128},
+ {128,192,255},
+ {128,255, 0},
+ {128,255, 64},
+ {128,255,128},
+ {128,255,255},
+ {160, 0, 0},
+ {160, 0, 64},
+ {160, 0,128},
+ {160, 0,255},
+ {160, 32, 0},
+ {160, 32, 64},
+ {160, 32,128},
+ {160, 32,255},
+ {160, 64, 0},
+ {160, 64, 64},
+ {160, 64,128},
+ {160, 64,255},
+ {160, 96, 0},
+ {160, 96, 64},
+ {160, 96,128},
+ {160, 96,255},
+ {160,128, 0},
+ {160,128, 64},
+ {160,128,128},
+ {160,128,255},
+ {160,160, 0},
+ {160,160, 64},
+ {160,160,128},
+ {160,160,255},
+ {160,192, 0},
+ {160,192, 64},
+ {160,192,128},
+ {160,192,255},
+ {160,255, 0},
+ {160,255, 64},
+ {160,255,128},
+ {160,255,255},
+ {192, 0, 0},
+ {192, 0, 64},
+ {192, 0,128},
+ {192, 0,255},
+ {192, 32, 0},
+ {192, 32, 64},
+ {192, 32,128},
+ {192, 32,255},
+ {192, 64, 0},
+ {192, 64, 64},
+ {192, 64,128},
+ {192, 64,255},
+ {192, 96, 0},
+ {192, 96, 64},
+ {192, 96,128},
+ {192, 96,255},
+ {192,128, 0},
+ {192,128, 64},
+ {192,128,128},
+ {192,128,255},
+ {192,160, 0},
+ {192,160, 64},
+ {192,160,128},
+ {192,160,255},
+ {192,192, 0},
+ {192,192, 64},
+ {192,192,128},
+ {192,192,255},
+ {192,255, 0},
+ {192,255, 64},
+ {192,255,128},
+ {192,255,255},
+ {255, 0, 0},
+ {255, 0, 64},
+ {255, 0,128},
+ {255, 0,255},
+ {255, 32, 0},
+ {255, 32, 64},
+ {255, 32,128},
+ {255, 32,255},
+ {255, 64, 0},
+ {255, 64, 64},
+ {255, 64,128},
+ {255, 64,255},
+ {255, 96, 0},
+ {255, 96, 64},
+ {255, 96,128},
+ {255, 96,255},
+ {255,128, 0},
+ {255,128, 64},
+ {255,128,128},
+ {255,128,255},
+ {255,160, 0},
+ {255,160, 64},
+ {255,160,128},
+ {255,160,255},
+ {255,192, 0},
+ {255,192, 64},
+ {255,192,128},
+ {255,192,255},
+ {255,255, 0},
+ {255,255, 64},
+ {255,255,128},
+ {255,255,255}
+ };
+static char runup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16, 0, 0,16,16,16,16, 0,255, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,255,233, 0,16,16,16,16, 0,255,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 0,255,255,255,255,255, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
+ 16,16, 0,255,255,255,255,255,255, 0, 0, 0,233, 0,233, 0,233, 0,255,255, 0, 0, 0,16,16,16,16,
+ 16,16,16, 0,255,255,255,255,255, 0, 0,233, 0,233, 0, 0, 0, 0,255,255,255,255,255, 0,16,16,16,
+ 16,16,16, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,233, 0, 0, 0,255,255,255,255,255,255, 0,16,16,
+ 16,16,16,16,16, 0, 0, 0, 0,255, 0, 0,233, 0, 0, 0, 0,255,255,255,255,255,255,255, 0, 0,16,
+ 16,16,16,16,16,16,16,16, 0, 0,255, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,233, 0,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,255, 0, 0,16,16, 0, 0,233, 0, 0,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,255, 0,255, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runup2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,255,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0,255,255,255,255,255,0,0,16,16,
+ 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233,0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0,0,255,255,255,0,0,0,0,16,16,16,
+ 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0,0,255,0,0,0,0,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runru_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37,73,255,255,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255,255,255,255,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109,255,255,255,255,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73,255,255,255,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48,8,73,255,255,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16,4,0,73,255,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+ static char runru2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32,0,73,255,219,0,8,8,8,12,16,16,
+ 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146,182,255,255,255,219,0,68,169,0,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218,255,255,255,255,219,68,246,77,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110,255,255,255,68,100,4,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char rundes_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char rundes2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runrd_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16, 4,0,73,255,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48, 8,73,255,255,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73,255,255,255,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 255,255,255,255,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255, 255,255,255,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37, 73,255,255,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runrd2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110,255,255,255,68,100,4,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218,255,255,255,255,219,68,246,77,16,16,
+ 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146, 182,255,255,255,219,0,68,169,0,16,16,
+ 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32, 0,73,255,219,0,8,8,8,12,16,16,
+ 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char rundown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0, 0,255,0,0,0,0,16,16,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0, 0,255,255,255,0,0,0,0,16,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233, 0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0, 0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0,255,255,255,255,255,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 255,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char rundown2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,0,255,0,0,0,233,16,16,0,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,255,0,255,0,0,16,16,0,0,233,0,0,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,233,0,16,
+ 16,16,16,16,16,0,0,0,0,255,0,0,233,0,0,0,0,255,255,255,255,255,255,255,0,0,16,
+ 16,16,16,0,0,0,0,255,255,255,0,0,0,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,233,0,233,0,0,0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,233,0,233,0,255,255,0,0,0,16,16,16,16,
+ 16,16,0,0,255,255,255,255,255,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
+ 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,255,233,0,16,16,16,16,0,255,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,16,16,16,16,0,255,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char runld_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runld2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
+ 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 255,255,255,255,73,0,32,32,8,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 255,255,255,255,255,73,100,100,4,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16, 233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0, 0,233,255,255,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0, 0,233,255,255,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255, 0,0,255,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runleft2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255,255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0,255,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255,0,0,255,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0,0,233,255,255,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,0,233,255,255,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char runlu_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runlu2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110,255,255,255,255,255,73,100,100,4,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73,255,255,255,255,73,0,32,32,8,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
+ 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
+ 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
+ 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+/*static char calcdes_data[] = {
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0,233, 0,233, 0,233,233,255, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0,255,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcdown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
+ 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
+ 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
+ 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,233,233,0,233,0,233, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
+ 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
+ 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
+ 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ }; */
+static char portsx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,220,220,220, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,220,220,220,220, 220,220,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,220,220,0,0,0,0, 0,0,220,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,220,220,220,0,0,0,0, 0,0,220,220,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0,220,220,220,220,220,0,0,0,0,0, 233,0,0,220,220,220,220,0,16,16,16,
+ 16,16,16,16,0,0,220,220,220,220,220,0,233,0,0,233, 0,0,0,220,220,220,220,0,0,16,16,
+ 16,16,16,16,0,220,220,220,220,220,220,0,0,0,233,0, 233,233,0,220,220,220,220,220,0,16,16,
+ 16,16,16,16,0,0,220,0,220,220,220,0,0,233,0,233, 0,233,0,220,220,0,220,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0,220,220,0,233,0,233,0, 233,233,0,220,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 220,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char portdx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 130,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0,130,130,0,233,0,233,0, 233,233,0,130,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0,130,0,130,130,130,0,0,233,0,233, 0,233,0,130,130,0,130,0,0,16,16,
+ 16,16,16,16,0,130,130,130,130,130,130,0,0,0,233,0, 233,233,0,130,130,130,130,130,0,16,16,
+ 16,16,16,16,0,0,130,130,130,130,130,0,233,0,0,233, 0,0,0,130,130,130,130,0,0,16,16,
+ 16,16,16,16,16,0,130,130,130,130,130,0,0,0,0,0, 233,0,0,130,130,130,130,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0,130,130,130,0,0,0,0, 0,0,130,130,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,130,130,0,0,0,0, 0,0,130,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,130,130,130,130, 130,130,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,130,130,130, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+
Index: branches/pj/soccer/stadio.h
===================================================================
--- branches/pj/soccer/stadio.h (nonexistent)
+++ branches/pj/soccer/stadio.h (revision 1085)
@@ -0,0 +1,8435 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: stadio.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+static unsigned int faro_width = 100;
+static unsigned int faro_height = 100;
+static unsigned int scale_width = 150;
+static unsigned int scale_height = 100;
+static unsigned int schermo_width = 300;
+static unsigned int schermo_height = 100;
+
+
+static char stadio_cmap[256][3] = {
+ { 0, 0, 0},
+ { 0, 0, 51},
+ { 0, 0,102},
+ { 0, 0,153},
+ { 0, 0,204},
+ { 0, 0,255},
+ { 51, 0, 0},
+ { 51, 0, 51},
+ { 51, 0,102},
+ { 51, 0,153},
+ { 51, 0,204},
+ { 51, 0,255},
+ {102, 0, 0},
+ {102, 0, 51},
+ {102, 0,102},
+ {102, 0,153},
+ {102, 0,204},
+ {102, 0,255},
+ {153, 0, 0},
+ {153, 0, 51},
+ {153, 0,102},
+ {153, 0,153},
+ {153, 0,204},
+ {153, 0,255},
+ {204, 0, 0},
+ {204, 0, 51},
+ {204, 0,102},
+ {204, 0,153},
+ {204, 0,204},
+ {204, 0,255},
+ {255, 0, 0},
+ {255, 0, 51},
+ {255, 0,102},
+ {255, 0,153},
+ {255, 0,204},
+ {255, 0,255},
+ { 0, 51, 0},
+ { 0, 51, 51},
+ { 0, 51,102},
+ { 0, 51,153},
+ { 0, 51,204},
+ { 0, 51,255},
+ { 51, 51, 0},
+ { 51, 51, 51},
+ { 51, 51,102},
+ { 51, 51,153},
+ { 51, 51,204},
+ { 51, 51,255},
+ {102, 51, 0},
+ {102, 51, 51},
+ {102, 51,102},
+ {102, 51,153},
+ {102, 51,204},
+ {102, 51,255},
+ {153, 51, 0},
+ {153, 51, 51},
+ {153, 51,102},
+ {153, 51,153},
+ {153, 51,204},
+ {153, 51,255},
+ {204, 51, 0},
+ {204, 51, 51},
+ {204, 51,102},
+ {204, 51,153},
+ {204, 51,204},
+ {204, 51,255},
+ {255, 51, 0},
+ {255, 51, 51},
+ {255, 51,102},
+ {255, 51,153},
+ {255, 51,204},
+ {255, 51,255},
+ { 0,102, 0},
+ { 0,102, 51},
+ { 0,102,102},
+ { 0,102,153},
+ { 0,102,204},
+ { 0,102,255},
+ { 51,102, 0},
+ { 51,102, 51},
+ { 51,102,102},
+ { 51,102,153},
+ { 51,102,204},
+ { 51,102,255},
+ {102,102, 0},
+ {102,102, 51},
+ {102,102,102},
+ {102,102,153},
+ {102,102,204},
+ {102,102,255},
+ {153,102, 0},
+ {153,102, 51},
+ {153,102,102},
+ {153,102,153},
+ {153,102,204},
+ {153,102,255},
+ {204,102, 0},
+ {204,102, 51},
+ {204,102,102},
+ {204,102,153},
+ {204,102,204},
+ {204,102,255},
+ {255,102, 0},
+ {255,102, 51},
+ {255,102,102},
+ {255,102,153},
+ {255,102,204},
+ {255,102,255},
+ { 0,153, 0},
+ { 0,153, 51},
+ { 0,153,102},
+ { 0,153,153},
+ { 0,153,204},
+ { 0,153,255},
+ { 51,153, 0},
+ { 51,153, 51},
+ { 51,153,102},
+ { 51,153,153},
+ { 51,153,204},
+ { 51,153,255},
+ {102,153, 0},
+ {102,153, 51},
+ {102,153,102},
+ {102,153,153},
+ {102,153,204},
+ {102,153,255},
+ {153,153, 0},
+ {153,153, 51},
+ {153,153,102},
+ {153,153,153},
+ {153,153,204},
+ {153,153,255},
+ {204,153, 0},
+ {204,153, 51},
+ {204,153,102},
+ {204,153,153},
+ {204,153,204},
+ {204,153,255},
+ {255,153, 0},
+ {255,153, 51},
+ {255,153,102},
+ {255,153,153},
+ {255,153,204},
+ {255,153,255},
+ { 0,204, 0},
+ { 0,204, 51},
+ { 0,204,102},
+ { 0,204,153},
+ { 0,204,204},
+ { 0,204,255},
+ { 51,204, 0},
+ { 51,204, 51},
+ { 51,204,102},
+ { 51,204,153},
+ { 51,204,204},
+ { 51,204,255},
+ {102,204, 0},
+ {102,204, 51},
+ {102,204,102},
+ {102,204,153},
+ {102,204,204},
+ {102,204,255},
+ {153,204, 0},
+ {153,204, 51},
+ {153,204,102},
+ {153,204,153},
+ {153,204,204},
+ {153,204,255},
+ {204,204, 0},
+ {204,204, 51},
+ {204,204,102},
+ {204,204,153},
+ {204,204,204},
+ {204,204,255},
+ {255,204, 0},
+ {255,204, 51},
+ {255,204,102},
+ {255,204,153},
+ {255,204,204},
+ {255,204,255},
+ { 0,255, 0},
+ { 0,255, 51},
+ { 0,255,102},
+ { 0,255,153},
+ { 0,255,204},
+ { 0,255,255},
+ { 51,255, 0},
+ { 51,255, 51},
+ { 51,255,102},
+ { 51,255,153},
+ { 51,255,204},
+ { 51,255,255},
+ {102,255, 0},
+ {102,255, 51},
+ {102,255,102},
+ {102,255,153},
+ {102,255,204},
+ {102,255,255},
+ {153,255, 0},
+ {153,255, 51},
+ {153,255,102},
+ {153,255,153},
+ {153,255,204},
+ {153,255,255},
+ {204,255, 0},
+ {204,255, 51},
+ {204,255,102},
+ {204,255,153},
+ {204,255,204},
+ {204,255,255},
+ {255,255, 0},
+ {255,255, 51},
+ {255,255,102},
+ {255,255,153},
+ {255,255,204},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255}
+ };
+static char farod_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,173,173,173,173,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,102,102,0,0,173,173,173,173,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,102,102,0,0,173,173,173,173,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,0,102,102,0,0,173,173,173,
+ 173,0,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,102,102,102,0,0,90,90,
+ 173,90,0,90,108,108,0,0,0,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,0,102,102,102,0,0,90,
+ 90,0,90,90,90,0,0,0,0,0,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,0,102,102,102,0,0,
+ 90,90,0,90,0,0,0,90,90,0,0,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,0,102,102,102,0,
+ 0,90,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,0,102,102,102,
+ 0,0,90,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,0,102,102,
+ 102,0,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,0,102,
+ 102,102,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,6,6,6,6,6,6,6,0,
+ 102,102,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,197,210,210,210,210,210,210,210,
+ 0,102,102,0,0,0,0,0,0,0,0,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,197,210,210,210,210,210,210,
+ 210,0,102,102,0,0,0,0,0,0,0,90,90,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,197,215,210,210,210,210,
+ 210,210,0,102,102,0,0,0,0,0,0,90,90,90,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,197,215,210,210,210,
+ 210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,197,215,210,210,
+ 210,210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,197,215,210,
+ 210,210,210,210,6,0,102,102,0,0,0,90,90,0,90,90,
+ 90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,197,215,
+ 210,210,210,210,6,11,0,102,102,0,0,0,90,90,0,90,
+ 90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,197,
+ 215,210,210,210,6,11,11,0,102,102,0,0,0,90,90,0,
+ 90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 197,210,210,210,6,11,11,11,0,102,102,0,0,0,90,90,
+ 0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,197,210,210,6,11,11,11,11,0,102,102,0,0,0,90,
+ 90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,197,210,6,11,11,11,11,11,0,102,102,0,0,0,
+ 90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,197,6,11,11,11,11,11,11,0,102,102,0,0,
+ 0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,0,
+ 0,0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,
+ 0,0,0,90,90,0,90,90,90,108,108,108,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,
+ 102,0,0,0,90,90,0,90,90,90,108,0,0,0,0,0,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 102,102,0,0,0,90,90,0,90,90,0,0,0,90,90,0,
+ 0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,102,102,0,0,0,90,90,0,0,0,0,90,90,90,90,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,0,102,102,0,0,0,90,0,0,0,90,90,90,90,90,
+ 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,0,102,102,0,0,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,6,6,6,
+ 6,6,6,0,102,102,0,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,210,
+ 210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,
+ 210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,
+ 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,
+ 210,210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,0,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,
+ 0,0,173,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,90,
+ 90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,
+ 90,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,197,210,210,210,210,210,6,0,102,102,102,102,
+ 0,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,197,210,210,210,210,6,11,0,102,102,102,
+ 102,0,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,197,210,210,210,6,11,11,0,102,102,
+ 102,102,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,197,210,210,6,11,11,11,0,102,
+ 102,102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,197,210,6,11,11,11,11,0,
+ 102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,197,6,11,11,11,11,11,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,211,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,211,211,
+ 211,211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,104,104,211,211,
+ 211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,104,104,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108
+ };
+static char faros_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,173,173,173,173,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,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,173,173,173,173,0,0,102,102,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,173,173,173,173,0,0,102,102,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,90,0,173,173,173,173,0,0,102,102,0,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,0,0,0,108,108,
+ 90,0,90,173,90,90,0,0,102,102,102,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,0,0,0,0,0,90,
+ 90,90,0,90,90,0,0,102,102,102,0,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,0,0,90,90,0,0,0,
+ 90,0,90,90,0,0,102,102,102,0,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
+ 0,90,90,0,0,102,102,102,0,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,90,0,0,102,102,102,0,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,0,0,102,102,102,0,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,0,102,102,102,0,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
+ 0,90,102,102,0,6,6,6,6,6,6,6,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,0,0,0,0,0,0,0,
+ 0,102,102,0,210,210,210,210,210,210,210,197,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,90,90,0,0,0,0,0,0,0,
+ 102,102,0,210,210,210,210,210,210,210,197,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,90,90,90,0,0,0,0,0,0,102,
+ 102,0,210,210,210,210,210,210,215,197,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,
+ 0,210,210,210,210,210,210,215,197,11,11,11,11,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,
+ 210,210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,6,
+ 210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,90,90,90,0,90,90,0,0,0,102,102,0,11,6,
+ 210,210,210,210,215,197,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,90,90,90,0,90,90,0,0,0,102,102,0,11,11,6,
+ 210,210,210,215,197,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 90,90,90,0,90,90,0,0,0,102,102,0,11,11,11,6,
+ 210,210,210,197,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,
+ 90,90,0,90,90,0,0,0,102,102,0,11,11,11,11,6,
+ 210,210,197,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,
+ 90,0,90,90,0,0,0,102,102,0,11,11,11,11,11,6,
+ 210,197,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,
+ 0,90,90,0,0,0,102,102,0,11,11,11,11,11,11,6,
+ 197,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,0,
+ 90,90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,0,0,0,108,108,108,90,90,90,0,90,
+ 90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,0,0,0,0,0,108,90,90,90,0,90,90,
+ 0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,0,0,90,90,0,0,0,90,90,0,90,90,0,
+ 0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,90,90,90,90,0,0,0,0,90,90,0,0,
+ 0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,90,90,90,90,90,90,0,0,0,90,0,0,0,
+ 102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,0,0,102,
+ 102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,0,102,102,
+ 0,6,6,6,6,6,6,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,102,102,0,
+ 210,210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,90,90,90,90,90,90,0,0,0,102,102,0,210,
+ 210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,90,90,90,90,0,0,0,102,102,0,210,210,
+ 210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,0,0,0,0,0,0,102,102,0,210,210,210,
+ 210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,173,0,0,0,0,0,0,0,102,102,0,210,210,210,210,
+ 210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 173,173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,
+ 210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
+ 173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,210,
+ 197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
+ 173,173,90,0,102,102,102,102,0,6,210,210,210,210,210,197,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 173,173,0,102,102,102,102,0,11,6,210,210,210,210,197,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,102,102,102,102,0,11,11,6,210,210,210,197,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,102,102,102,0,11,11,11,6,210,210,197,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,102,0,11,11,11,11,6,210,197,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,11,11,11,11,11,6,197,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,211,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,211,211,211,211,211,211,211,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,11,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,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
+ 104,211,211,211,211,211,211,211,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
+ 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
+ 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
+ 104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108
+};
+static char scale_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 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,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,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,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,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,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 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,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,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,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,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,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,
+ 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,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,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,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,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,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 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,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,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,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,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,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 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,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,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,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,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,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 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,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,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,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,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,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 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,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,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,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,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,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 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,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,0,0,0,0,0,0,0,0,0,0,
+ 0,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,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,
+ 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,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108
+};
+static char schermo_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 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,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,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,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,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,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,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,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,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,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+};
+/*
+static char goal2_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,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,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,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,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,0,0,0,0,0,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,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,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,
+ 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,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,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,215,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
+ 181,181,181,181,215,215,181,181,181,181,181,181,181,181,215,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,215,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
+ 181,181,181,181,215,181,215,181,181,181,181,181,181,181,181,181,
+ 215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,215,215,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,215,215,215,181,215,215,215,215,181,181,215,0,0,0,
+ 0,0,0,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,215,181,181,181,215,0,0,215,215,215,
+ 215,215,215,0,0,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,215,215,215,215,
+ 215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,215,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,215,0,0,215,215,215,0,215,
+ 215,215,215,215,215,0,0,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,215,215,215,215,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,181,215,181,181,181,215,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,0,215,0,215,215,0,0,0,
+ 215,215,0,215,215,215,215,0,215,215,215,215,215,215,181,215,
+ 181,181,181,215,215,215,215,215,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,0,0,0,0,215,0,0,0,
+ 215,0,0,0,215,215,215,0,181,181,181,181,181,181,215,215,
+ 215,215,215,215,215,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,0,215,0,0,0,215,0,0,0,
+ 215,0,0,0,215,215,0,215,0,181,215,215,215,215,181,181,
+ 215,181,181,181,181,215,215,215,215,215,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,0,215,0,0,0,215,215,0,215,
+ 215,0,0,0,215,0,0,0,0,215,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,
+ 215,215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,0,215,215,215,0,215,215,215,215,215,
+ 215,215,0,215,215,0,0,0,215,0,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,215,215,215,215,215,215,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,0,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,0,0,0,215,0,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,215,181,181,181,0,215,215,0,215,215,215,215,215,215,
+ 215,215,215,215,215,215,0,215,215,0,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,215,
+ 215,215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,215,215,215,0,215,0,0,0,215,215,215,215,215,
+ 0,215,215,215,215,215,215,215,215,0,215,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
+ 215,215,215,181,215,181,0,215,0,0,0,215,215,215,215,0,
+ 0,0,215,215,215,215,215,215,215,0,181,215,215,215,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,0,215,0,0,0,215,215,215,215,0,
+ 0,0,215,215,0,215,215,215,215,0,181,181,181,181,215,215,
+ 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,0,215,215,215,215,215,0,
+ 0,0,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
+ 215,215,181,181,215,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,0,215,215,
+ 0,215,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
+ 181,181,215,215,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,215,215,215,0,0,0,215,
+ 215,215,215,0,0,0,215,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
+ 215,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,0,215,215,215,0,0,0,215,
+ 215,215,215,215,0,215,215,0,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,0,0,215,0,0,0,215,
+ 215,215,215,215,215,0,0,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,0,0,0,215,215,
+ 215,215,215,0,0,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,0,0,0,
+ 0,0,0,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,0,0,0,215,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,215,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,215,215,215,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,0,0,0,0,0,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 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,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,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,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,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,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,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,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,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,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+};
+*/
+static char goal1_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 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,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,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,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,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,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,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,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,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,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,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,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,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,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,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,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,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,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,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,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,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,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,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,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,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,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,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,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,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,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,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,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,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,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,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,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,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,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,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,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,
+ 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,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,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,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,
+ 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,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,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,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,
+ 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,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,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,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,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,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,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,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,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,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,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,0,0,0,204,204,204,204,204,204,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,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,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,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,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,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,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,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,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,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,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,
+ 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,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 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,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,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,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,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,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,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,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,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,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,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+ };
+
+
+
+
+
+
+
+
Index: branches/pj/soccer/position.h
===================================================================
--- branches/pj/soccer/position.h (nonexistent)
+++ branches/pj/soccer/position.h (revision 1085)
@@ -0,0 +1,57 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: position.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "iniziali.h"
+
+struct position{
+ int x;
+ int y;
+ float dx;
+ float dy;
+} initial_calc_position[]={{ORI_RES/5,VER_RES/5+100},{ORI_RES/5,8*VER_RES/10},{ORI_RES/2,VER_RES/2+40},{9*ORI_RES/10,VER_RES/5+100},{9*ORI_RES/10,8*VER_RES/10}};
+
+
Index: branches/pj/soccer/calc2.h
===================================================================
--- branches/pj/soccer/calc2.h (nonexistent)
+++ branches/pj/soccer/calc2.h (revision 1085)
@@ -0,0 +1,693 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: calc2.h,v 1.1.1.1 2002-09-02 09:37:43 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:43 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
+static char B_runup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16, 0, 0,16,16,16,16, 0, 35, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 35,233, 0,16,16,16,16, 0, 35,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
+ 16,16, 0, 35, 35, 35, 35, 35, 35, 0, 0, 0,233, 0,233, 0,233, 0, 35, 35, 0, 0, 0,16,16,16,16,
+ 16,16,16, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0,16,16,16,
+ 16,16,16, 0, 0, 0, 0, 35, 35, 35, 0, 0, 0, 0,233, 0, 0, 0, 35, 35, 35, 35, 35, 35, 0,16,16,
+ 16,16,16,16,16, 0, 0, 0, 0, 35, 0, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0,16,
+ 16,16,16,16,16,16,16,16, 0, 0, 35, 0, 0, 0, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,233, 0,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0, 35, 0, 0,16,16, 0, 0,233, 0, 0,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 35, 0, 35, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runup2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0,0, 35, 35, 35,0,0,0,0,16,16,16,
+ 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0,0, 35,0,0,0,0,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runru_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37,73, 35, 35,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73, 35, 35, 35,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48,8,73, 35, 35,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16,4,0,73, 35,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+ static char B_runru2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32,0,73, 35,219,0,8,8,8,12,16,16,
+ 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146,182, 35, 35, 35,219,0,68,169,0,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218, 35, 35, 35, 35,219,68,246,77,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110, 35, 35, 35,68,100,4,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_rundes_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_rundes2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runrd_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16, 4,0,73, 35,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48, 8,73, 35, 35,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73, 35, 35, 35,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37, 73, 35, 35,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runrd2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110, 35, 35, 35,68,100,4,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218, 35, 35, 35, 35,219,68,246,77,16,16,
+ 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146, 182, 35, 35, 35,219,0,68,169,0,16,16,
+ 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32, 0,73, 35,219,0,8,8,8,12,16,16,
+ 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_rundown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0, 0, 35,0,0,0,0,16,16,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0, 0, 35, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0, 0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_rundown2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35,0, 35,0,0,0,233,16,16,0,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0, 35,0,0,16,16,0,0,233,0,0,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 35, 35,0,0,0,0,0,0,233,0,16,
+ 16,16,16,16,16,0,0,0,0, 35,0,0,233,0,0,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,16,
+ 16,16,16,0,0,0,0, 35, 35, 35,0,0,0,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,0,0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,233,0,233,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,0,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
+ 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0, 35,233,0,16,16,16,16,0, 35,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,16,16,16,16,0, 35,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_runld_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runld2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
+ 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16, 233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0, 0,233, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0, 0,233, 35, 35, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35, 0,0, 35,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runleft2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35,0,0, 35,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0,0,233, 35, 35, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,0,233, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_runlu_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runlu2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
+ 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
+ 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
+ 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+/*
+static char portesx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 100, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 100, 100, 100,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 100,0, 100,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 100,0, 100, 100, 100, 100, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 100, 100,0,0,0,0,0, 100,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0, 100, 100, 100, 100, 100, 100, 100,0,0,0,0,233,0, 0, 100,0,0,0,0,16,16,16,16,16,
+ 16,16,0, 100, 100, 100, 100, 100, 100,0,0,0,233,0,0,0, 0, 100, 100, 100,0,0,0,0,16,16,16,
+ 16,16,16,0, 100, 100, 100, 100, 100,0,0,0,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,16,16,16,
+ 16,16,16,16,0,0,0, 100, 100,0,233,0,233,0,233,0, 0,0, 100, 100, 100, 100, 100, 100,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 100, 0,16,16,16,16,0,233, 100,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 100,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 100, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+
+static char calcdes_data[] = {
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0,233, 0,233, 0,233,233, 35, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcdown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35,233,233,0,233,0,233, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
+ 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };*/
+
Index: branches/pj/soccer/images.h
===================================================================
--- branches/pj/soccer/images.h (nonexistent)
+++ branches/pj/soccer/images.h (revision 1085)
@@ -0,0 +1,82 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: images.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#define SFONDO rgb16(0,128,0)
+#define B 255 /*BIANCO*/
+#define V 16 /*verde*/
+#define M 200 /*marrone*/
+#define C 15 /*bianco*/
+#define G 14 /*Giallo*/
+#define N 0 /*NERO*/
+#define P 13 /*Rosa*/
+
+char pallone[64]={ V,V,V,V,V,V,V,V,
+ V,V,B,B,B,B,V,V,
+ V,N,B,B,B,B,N,V,
+ B,B,N,B,B,N,B,B,
+ B,B,B,N,N,B,B,B,
+ B,B,N,B,B,N,B,B,
+ V,N,B,B,B,B,N,V,
+ V,V,B,B,B,B,V,V,
+ };
+char goal_data[]={N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,G,G,G,G,N,G,G,G,N,G,G,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,G,G,N,G,N,G,N,G,G,G,N,G,N,N,N,N,
+ N,N,G,N,N,G,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,G,G,G,N,G,G,G,N,G,N,G,N,G,G,G,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ };
+
Index: branches/pj/soccer/readme
===================================================================
--- branches/pj/soccer/readme (nonexistent)
+++ branches/pj/soccer/readme (revision 1085)
@@ -0,0 +1,10 @@
+S.Ha.R.K. SOCCER Demo
+---------------------
+
+This demo has been developed by Merli Andrea and Zucchetti Alessandro
+in the context of an assignment during the course of industrial informatic
+at the University of Pavia, Italy.
+
+More informations in the soccer.ps file.
+
+Paolo
Index: branches/pj/soccer/makefile
===================================================================
--- branches/pj/soccer/makefile (nonexistent)
+++ branches/pj/soccer/makefile (revision 1085)
@@ -0,0 +1,17 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= soccer
+
+include $(BASE)/config/example.mk
+
+soccer:
+ make -f $(SUBMAKE) APP=soccer INIT= OTHEROBJS="initfile.o"
+
+
Index: branches/pj/soccer/iniziali.h
===================================================================
--- branches/pj/soccer/iniziali.h (nonexistent)
+++ branches/pj/soccer/iniziali.h (revision 1085)
@@ -0,0 +1,100 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: iniziali.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:44 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#define YMENU 10 /* menu level */
+#define XMIN 1
+#define XMAX 799
+#define YMIN 100
+#define YMAX 599
+#define D 27
+#define VEL 10 /* linear velocity (def. = 6) */
+#define ANG 15 /* angolo massimo sterzata (15) */
+#define ESC 27 /* ASCII code of ESCAPE key */
+#define MAX_P 10 /* max number of calc */
+#define MAX_B 1
+#define GROUP_SOFT 4
+#define GROUP_PLAY 2
+#define GROUP_BALL 3
+#define PERIOD_BALL 30000
+#define PERIOD_CALC 100000
+#define PERIOD_PORT 30000
+#define CALC_WCET 5000
+#define PORT_WCET 4000
+#define BALL_WCET 5000
+#define BALL_RADIUS 5
+#define VER_RES 600
+#define ORI_RES 800
+#define COL_DEP 16
+#define FREE_MODE 0 /*il giocatore corre palla al piede*/
+#define PASS_MODE 1 /*il giocatore passa la palla rasoterra*/
+#define NO_BALL_MODE 4
+#define PENALTY_MODE_BLUE 5
+#define PENALTY_MODE_WHITE 6
+#define RESTART 6
+#define CANC 370
+#define RLEFT 1 /*RUN LEFT*/
+#define RDOWN 3 /*RUN DOWN*/
+#define RUP 5 /*RUN UP*/
+#define RRIGHT 7 /*RUN RIGHT*/
+#define RRUP 9 /*RUN RIGHT UP*/
+#define RRDW 15 /*RUN RIGHT DOWN*/
+#define RLUP 11 /*RUN LEFT UP*/
+#define RLDW 13 /*RUN LEFT DOWN*/
+#define RLEFT2 17 /*RUN LEFT*/
+#define RDOWN2 19 /*RUN DOWN*/
+#define RUP2 21 /*RUN UP*/
+#define RRIGHT2 23 /*RUN RIGHT*/
+#define RRUP2 25 /*RUN RIGHT UP*/
+#define RRDW2 27 /*RUN RIGHT DOWN*/
+#define RLUP2 29 /*RUN LEFT UP*/
+#define RLDW2 31 /*RUN LEFT DOWN*/
+#define NO_ACT 0
+#define GOAL_ACT 2
+#define MENU_ACT 3
+#define NO_PENALTY 0
+#define PENALTY 1
Index: branches/pj/cash/cash.c
===================================================================
--- branches/pj/cash/cash.c (nonexistent)
+++ branches/pj/cash/cash.c (revision 1085)
@@ -0,0 +1,982 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: cash.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the aperiodic server CBS (Total Bandwidth Server)
+
+ Read CBS.h for further details.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#include "cash.h"
+#include <ll/stdio.h>
+#include <ll/string.h>
+#include <kernel/model.h>
+#include <kernel/descr.h>
+#include <kernel/var.h>
+#include <kernel/func.h>
+
+/*+ 4 debug purposes +*/
+#undef CBS_TEST
+
+#ifdef TESTG
+#include "drivers/glib.h"
+TIME x,oldx;
+extern TIME starttime;
+#endif
+
+
+
+
+
+
+/*+ Status used in the level +*/
+#define CBSGHD_IDLE APER_STATUS_BASE /*+ waiting the activation +*/
+#define CBSGHD_ZOMBIE APER_STATUS_BASE+1 /*+ waiting the period end +*/
+#define CBSGHD_DELAY APER_STATUS_BASE+2 /*+ waiting the delay end +*/
+
+/* structure of an element of the capacity queue */
+struct cap_queue {
+ int cap;
+ struct timespec dead;
+ struct cap_queue *next;
+};
+
+/*+ the level redefinition for the CBS_HD level +*/
+typedef struct {
+ level_des l; /*+ the standard level descriptor +*/
+
+ /* The wcet are stored in the task descriptor, but we need
+ an array for the deadlines. We can't use the timespec_priority
+ field because it is used by the master level!!!...
+ Notice that however the use of the timespec_priority field
+ does not cause any problem... */
+
+ struct timespec cbsghd_dline[MAX_PROC]; /*+ CBSGHD deadlines +*/
+
+ TIME period[MAX_PROC]; /*+ CBSGHD activation period +*/
+
+ TIME maxperiod[MAX_PROC]; /*+ maximum period of each elastic task +*/
+
+ int cremaining[MAX_PROC]; /*+ instance remaining computation time +*/
+
+ TIME act_period[MAX_PROC]; /*+ actual period of each elastic task: it
+ must be less than maxperiod!!! +*/
+
+ TIME last_response_time[MAX_PROC]; /* response time of the last instance */
+
+ TIME cnormal[MAX_PROC]; /*+ CBSGHD normal computation time +*/
+
+ struct timespec reactivation_time[MAX_PROC];
+ /*+ the time at witch the reactivation timer is post +*/
+ int reactivation_timer[MAX_PROC];
+ /*+ the recativation timer +*/
+
+ struct cap_queue *queue; /* pointer to the spare capacity queue */
+
+ int flags; /*+ the init flags... +*/
+
+ bandwidth_t U; /*+ the used bandwidth by the server +*/
+
+ int idle; /* the idle flag... */
+
+ struct timespec start_idle; /*gives the start time of the last idle period */
+
+ LEVEL scheduling_level;
+
+} CBSGHD_level_des;
+
+
+/* insert a capacity in the queue capacity ordering by deadline */
+
+static int c_insert(struct timespec dead, int cap, struct cap_queue **que,
+ PID p)
+{
+ struct cap_queue *prev, *n, *new;
+
+ prev = NULL;
+ n = *que;
+
+ while ((n != NULL) &&
+ !TIMESPEC_A_LT_B(&dead, &n->dead)) {
+ prev = n;
+ n = n->next;
+ }
+
+
+ new = (struct cap_queue *)kern_alloc(sizeof(struct cap_queue));
+ if (new == NULL) {
+ kern_printf("\nNew cash_queue element failed\n");
+ kern_raise(XUNVALID_TASK, p);
+ return -1;
+ }
+ new->next = NULL;
+ new->cap = cap;
+ new->dead = dead;
+
+ if (prev != NULL)
+ prev->next = new;
+ else
+ *que = new;
+
+ if (n != NULL)
+ new->next = n;
+ return 0;
+}
+
+/* extract the first element from the capacity queue */
+
+static int c_extractfirst(struct cap_queue **que)
+{
+ struct cap_queue *p = *que;
+
+
+ if (*que == NULL) return(-1);
+
+ *que = (*que)->next;
+
+ kern_free(p, sizeof(struct cap_queue));
+ return(1);
+}
+
+/* read data of the first element from the capacity queue */
+
+static void c_readfirst(struct timespec *d, int *c, struct cap_queue *que)
+{
+ *d = que->dead;
+ *c = que->cap;
+}
+
+/* write data of the first element from the capacity queue */
+
+static void c_writefirst(struct timespec dead, int cap, struct cap_queue *que)
+{
+ que->dead = dead;
+ que->cap = cap;
+}
+
+
+static void CBSGHD_activation(CBSGHD_level_des *lev,
+ PID p,
+ struct timespec *acttime)
+{
+ JOB_TASK_MODEL job;
+
+
+ /* This rule is used when we recharge the budget at initial task activation
+ and each time a new task instance must be activated */
+
+ if (TIMESPEC_A_GT_B(acttime, &lev->cbsghd_dline[p])) {
+ /* we modify the deadline ... */
+ TIMESPEC_ASSIGN(&lev->cbsghd_dline[p], acttime);
+ }
+
+ lev->act_period[p] = 0;
+
+ if (proc_table[p].avail_time > 0)
+ proc_table[p].avail_time = 0;
+
+
+
+
+ /* there is a while because if the wcet is << than the system tick
+ we need to postpone the deadline many times */
+ while (proc_table[p].avail_time <= 0) {
+
+ /* A spare capacity is inserted in the capacity queue!! */
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
+ lev->act_period[p] += lev->period[p];
+ c_insert(lev->cbsghd_dline[p], lev->cnormal[p], &lev->queue, p);
+
+
+ /* it exploits available capacities from the capacity queue */
+ while (proc_table[p].avail_time < (int)lev->cnormal[p] &&
+ lev->queue != NULL) {
+ struct timespec dead;
+ int cap, delta;
+ delta = lev->cnormal[p] - proc_table[p].avail_time;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (!TIMESPEC_A_GT_B(&dead, &lev->cbsghd_dline[p])) {
+ if (cap > delta) {
+ proc_table[p].avail_time += delta;
+ c_writefirst(dead, cap - delta, lev->queue);
+ }
+ else {
+ proc_table[p].avail_time += cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ else
+ break;
+ }
+ }
+
+ lev->cremaining[p] = proc_table[p].wcet - proc_table[p].avail_time;
+
+
+#ifdef TESTG
+ if (starttime && p == 3) {
+ oldx = x;
+ x = ((lev->cbsghd_dline[p].tv_sec*1000000+lev->cbsghd_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
+ // kern_printf("(a%d)",lev->cbsghd_dline[p].tv_sec*1000000+lev->cbsghd_dline[p].tv_nsec/1000);
+ if (oldx > x) sys_end();
+ if (x<640)
+ grx_plot(x, 15, 8);
+ }
+#endif
+
+ /* and, finally, we reinsert the task in the master level */
+ job_task_default_model(job, lev->cbsghd_dline[p]);
+ job_task_def_yesexc(job);
+ level_table[ lev->scheduling_level ]->
+ guest_create(lev->scheduling_level, p, (TASK_MODEL *)&job);
+ level_table[ lev->scheduling_level ]->
+ guest_activate(lev->scheduling_level, p);
+}
+
+
+static char *CBSGHD_status_to_a(WORD status)
+{
+ if (status < MODULE_STATUS_BASE)
+ return status_to_a(status);
+
+ switch (status) {
+ case CBSGHD_IDLE : return "CBSGHD_Idle";
+ case CBSGHD_ZOMBIE : return "CBSGHD_Zombie";
+ case CBSGHD_DELAY : return "CBSGHD_Delay";
+ default : return "CBSGHD_Unknown";
+ }
+}
+
+
+
+
+/* this is the periodic reactivation of the task... */
+static void CBSGHD_timer_reactivate(void *par)
+{
+ PID p = (PID) par;
+ CBSGHD_level_des *lev;
+
+ lev = (CBSGHD_level_des *)level_table[proc_table[p].task_level];
+
+ if (proc_table[p].status == CBSGHD_IDLE) {
+ /* the task has finished the current activation and must be
+ reactivated */
+
+ /* request_time represents the time of the last instance release!! */
+ TIMESPEC_ASSIGN(&proc_table[p].request_time, &lev->reactivation_time[p]);
+
+ /* If idle=1, then we have to discharge the capacities stored in
+ the capacity queue up to the length of the idle interval */
+ if (lev->idle == 1) {
+ TIME interval;
+ struct timespec delta;
+ lev->idle = 0;
+ SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
+ /* length of the idle interval expressed in usec! */
+ interval = TIMESPEC2NANOSEC(&delta) / 1000;
+
+ /* it discharge the available capacities from the capacity queue */
+ while (interval > 0 && lev->queue != NULL) {
+ struct timespec dead;
+ int cap;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (cap > interval) {
+ c_writefirst(dead, cap - interval, lev->queue);
+ interval = 0;
+ }
+ else {
+ interval -= cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ }
+
+ CBSGHD_activation(lev,p,&lev->reactivation_time[p]);
+
+ /* check the constraint on the maximum period permitted... */
+ if (lev->act_period[p] > lev->maxperiod[p]) {
+ kern_printf("Deadline miss(timer_react.! process:%d act_period:%lu maxperiod:%lu\n",
+ p, lev->act_period[p], lev->maxperiod[p]);
+ kern_raise(XDEADLINE_MISS,p);
+ }
+
+
+ /* Set the reactivation timer */
+ TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbsghd_dline[p]);
+ lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
+ CBSGHD_timer_reactivate,
+ (void *)p);
+ event_need_reschedule();
+ }
+ else {
+ /* this situation cannot occur */
+ kern_printf("Trying to reactivate a task which is not IDLE!!!/n");
+ kern_raise(XUNVALID_TASK,p);
+ }
+}
+
+
+
+
+
+static void CBSGHD_avail_time_check(CBSGHD_level_des *lev, PID p)
+{
+
+ /*+ if the capacity became negative the remaining computation time
+ is diminuished.... +*/
+ /* if (p==4)
+ kern_printf("(old dead:%d av_time:%d crem:%d)\n",
+ lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
+ lev->cremaining[p]); */
+
+
+ if (proc_table[p].avail_time < 0)
+ lev->cremaining[p] += proc_table[p].avail_time;
+
+ if (lev->cremaining[p] <= 0) {
+ kern_printf("Task:%d WCET violation \n", p);
+ kern_raise(XWCET_VIOLATION, p);
+ ll_abort(666);
+ }
+
+
+ /* there is a while because if the wcet is << than the system tick
+ we need to postpone the deadline many times */
+ while (proc_table[p].avail_time <= 0) {
+ /* it exploits available capacities from the capacity queue */
+ while (proc_table[p].avail_time < lev->cremaining[p]
+ && lev->queue != NULL) {
+ struct timespec dead;
+ int cap, delta;
+ delta = lev->cremaining[p] - proc_table[p].avail_time;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (!TIMESPEC_A_GT_B(&dead, &lev->cbsghd_dline[p])) {
+ if (cap > delta) {
+ proc_table[p].avail_time += delta;
+ c_writefirst(dead, cap - delta, lev->queue);
+ }
+ else {
+ proc_table[p].avail_time += cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ else
+ break;
+ }
+
+ /* if (p==5 && proc_table[p].avail_time <= 0 &&
+ lev->cremaining[p] > lev->cnormal[p])
+ kern_printf("(inter dead:%d av_time:%d crem:%d)\n",
+ lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
+ lev->cremaining[p]); */
+
+
+ /* The remaining computation time is modified according
+ to the new budget! */
+ if (proc_table[p].avail_time > 0)
+ lev->cremaining[p] -= proc_table[p].avail_time;
+ else {
+ /* the CBSGHD rule for recharging the capacity: */
+ if (lev->cremaining[p] > lev->cnormal[p]) {
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
+ lev->act_period[p] += lev->period[p];
+ /* A spare capacity is inserted in the capacity queue!! */
+ c_insert(lev->cbsghd_dline[p], lev->cnormal[p], &lev->queue, p);
+ }
+ else {
+ TIME t;
+ t = (lev->cremaining[p] * lev->period[p]) / lev->cnormal[p];
+ ADDUSEC2TIMESPEC(t, &lev->cbsghd_dline[p]);
+ lev->act_period[p] += t;
+ /* A spare capacity is inserted in the capacity queue!! */
+ c_insert(lev->cbsghd_dline[p], lev->cremaining[p], &lev->queue, p);
+ }
+ }
+ }
+
+ /* if (p==4)
+ kern_printf("n dead:%d av_time:%d crem:%d)\n",
+ lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
+ lev->cremaining[p]); */
+
+ /* check the constraint on the maximum period permitted... */
+ if (lev->act_period[p] > lev->maxperiod[p]) {
+ /*kern_printf("n dead:%d av_time:%d crem:%d)\n",
+ lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
+ lev->cremaining[p]); */
+ kern_printf("Deadline miss(av.time_check! process:%d act_period:%lu maxperiod:%lu\n",
+ p, lev->act_period[p], lev->maxperiod[p]);
+ kern_raise(XDEADLINE_MISS,p);
+ }
+
+
+
+ if (TIMESPEC_A_LT_B(&lev->reactivation_time[p], &lev->cbsghd_dline[p])) {
+ /* we delete the reactivation timer */
+ event_delete(lev->reactivation_timer[p]);
+ /* repost the event at the next instance deadline... */
+ lev->reactivation_time[p] = lev->cbsghd_dline[p];
+ lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
+ CBSGHD_timer_reactivate,
+ (void *)p);
+ }
+
+#ifdef TESTG
+ if (starttime && p == 3) {
+ oldx = x;
+ x = ((lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
+ // kern_printf("(e%d avail%d)",lev->cbsghd_dline[p].tv_sec*1000000+
+ lev->cbsghd_dline[p].tv_nsec/1000,proc_table[p].avail_time);
+ if (oldx > x) sys_end();
+ if (x<640)
+ grx_plot(x, 15, 2);
+ }
+#endif
+
+}
+
+
+/*+ this function is called when a killed or ended task reach the
+ period end +*/
+static void CBSGHD_timer_zombie(void *par)
+{
+ PID p = (PID) par;
+ CBSGHD_level_des *lev;
+
+ lev = (CBSGHD_level_des *)level_table[proc_table[p].task_level];
+
+ /* we finally put the task in the FREE status */
+ proc_table[p].status = FREE;
+ q_insertfirst(p,&freedesc);
+
+ /* and free the allocated bandwidth */
+ lev->U -= (MAX_BANDWIDTH/lev->period[p]) * lev->cnormal[p];
+
+}
+
+
+static int CBSGHD_level_accept_task_model(LEVEL l, TASK_MODEL *m)
+{
+
+
+ if (m->pclass == ELASTIC_HARD_PCLASS || m->pclass ==
+ (ELASTIC_HARD_PCLASS | l)) {
+ ELASTIC_HARD_TASK_MODEL *s = (ELASTIC_HARD_TASK_MODEL *)m;
+ bandwidth_t b1, b2;
+ /* kern_printf("accept :ELASTIC TASK found!!!!!!\n"); */
+ b1 = (MAX_BANDWIDTH / s->period) * s->cnormal;
+ b2 = (MAX_BANDWIDTH / s->maxperiod) * s->wcet;
+ if (s->wcet && s->cnormal && s->period && s->maxperiod &&
+ s->wcet >= s->cnormal && b1 >= b2)
+ return 0;
+ /* kern_printf("period: %d maxperiod: %d cnormal: %d wcet: %d, b1: %d b2:
+ %d\n", s->period, s->maxperiod, s->cnormal, s->wcet, b1, b2); */
+ }
+ return -1;
+}
+
+static int CBSGHD_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
+{
+ return -1;
+}
+
+static char *onoff(int i)
+{
+ if (i)
+ return "On ";
+ else
+ return "Off";
+}
+
+static void CBSGHD_level_status(LEVEL l)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ PID p;
+
+ kern_printf("On-line guarantee : %s\n",
+ onoff(lev->flags & CBSGHD_ENABLE_GUARANTEE));
+ kern_printf("Used Bandwidth : %u/%u\n",
+ lev->U, MAX_BANDWIDTH);
+
+ for (p=0; p<MAX_PROC; p++)
+ if (proc_table[p].task_level == l && proc_table[p].status != FREE )
+ kern_printf("Pid: %2d Name: %10s Period: %9ld Dline: %9ld.%6ld Stat: %s\n",
+ p,
+ proc_table[p].name,
+ lev->period[p],
+ lev->cbsghd_dline[p].tv_sec,
+ lev->cbsghd_dline[p].tv_nsec/1000,
+ CBSGHD_status_to_a(proc_table[p].status));
+}
+
+static PID CBSGHD_level_scheduler(LEVEL l)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ /* it stores the actual time and set the IDLE flag in order to handle
+ the capacity queue discharging!!! */
+ lev->idle = 1;
+ ll_gettime(TIME_EXACT, &lev->start_idle);
+
+
+ /* the CBSGHD don't schedule anything...
+ it's an EDF level or similar that do it! */
+ return NIL;
+}
+
+/* The on-line guarantee is enabled only if the appropriate flag is set... */
+static int CBSGHD_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ if (lev->flags & CBSGHD_FAILED_GUARANTEE) {
+ *freebandwidth = 0;
+ //kern_printf("guarantee :garanzia fallita!!!!!!\n");
+ return 0;
+ }
+ else if (*freebandwidth >= lev->U) {
+ *freebandwidth -= lev->U;
+ return 1;
+ }
+ else {
+ //kern_printf("guarantee :garanzia fallita per mancanza di banda!!!!!!\n");
+ //kern_printf("freeband: %d request band: %d", *freebandwidth, lev->U);
+ return 0;
+ }
+}
+
+static int CBSGHD_task_create(LEVEL l, PID p, TASK_MODEL *m)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ /* if the CBSGHD_task_create is called, then the pclass must be a
+ valid pclass. */
+ ELASTIC_HARD_TASK_MODEL *s = (ELASTIC_HARD_TASK_MODEL *)m;
+
+ /* Enable wcet check */
+ proc_table[p].avail_time = 0;
+ proc_table[p].wcet = s->wcet;
+ proc_table[p].control |= CONTROL_CAP;
+
+ lev->period[p] = s->period;
+ lev->maxperiod[p] = s->maxperiod;
+ lev->cnormal[p] = s->cnormal;
+ NULL_TIMESPEC(&lev->cbsghd_dline[p]);
+
+
+ /* update the bandwidth... */
+ if (lev->flags & CBSGHD_ENABLE_GUARANTEE) {
+ bandwidth_t b;
+ b = (MAX_BANDWIDTH / s->period) * s->cnormal;
+
+ /* really update lev->U, checking an overflow... */
+ if (MAX_BANDWIDTH - lev->U > b)
+ lev->U += b;
+ else
+ /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
+ (see EDF.c) */
+ lev->flags |= CBSGHD_FAILED_GUARANTEE;
+ }
+
+
+
+ return 0; /* OK, also if the task cannot be guaranteed... */
+}
+
+static void CBSGHD_task_detach(LEVEL l, PID p)
+{
+ /* the CBSGHD level doesn't introduce any dinamic allocated new field.
+ we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
+ bandwidth */
+
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ if (lev->flags & CBSGHD_FAILED_GUARANTEE)
+ lev->flags &= ~CBSGHD_FAILED_GUARANTEE;
+ else
+ lev->U -= (MAX_BANDWIDTH / lev->period[p]) * lev->cnormal[p];
+
+
+}
+
+static int CBSGHD_task_eligible(LEVEL l, PID p)
+{
+ return 0; /* if the task p is chosen, it is always eligible */
+}
+
+#ifdef __TEST1__
+ extern int testactive;
+ extern struct timespec s_stime[];
+ extern TIME s_curr[];
+ extern TIME s_PID[];
+ extern int useds;
+#endif
+
+static void CBSGHD_task_dispatch(LEVEL l, PID p, int nostop)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ level_table[ lev->scheduling_level ]->
+ guest_dispatch(lev->scheduling_level,p,nostop);
+
+#ifdef __TEST1__
+ if (testactive)
+ {
+ TIMESPEC_ASSIGN(&s_stime[useds], &schedule_time);
+ s_curr[useds] = proc_table[p].avail_time;
+ s_PID[useds] = p;
+ useds++;
+ }
+#endif
+}
+
+static void CBSGHD_task_epilogue(LEVEL l, PID p)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ JOB_TASK_MODEL job;
+
+ /* check if the budget is finished... */
+ if ( proc_table[p].avail_time <= 0) {
+ /* we kill the current activation */
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level, p);
+
+ /* we modify the deadline */
+ CBSGHD_avail_time_check(lev, p);
+
+ /* and, finally, we reinsert the task in the master level */
+ job_task_default_model(job, lev->cbsghd_dline[p]);
+ job_task_def_yesexc(job);
+ level_table[ lev->scheduling_level ]->
+ guest_create(lev->scheduling_level, p, (TASK_MODEL *)&job);
+ level_table[ lev->scheduling_level ]->
+ guest_activate(lev->scheduling_level, p);
+ // kern_printf("epil : dl %d per %d p %d |\n",
+ // lev->cbsghd_dline[p].tv_nsec/1000,lev->period[p],p);
+
+ }
+ else
+ /* the task has been preempted. it returns into the ready queue by
+ calling the guest_epilogue... */
+ level_table[ lev->scheduling_level ]->
+ guest_epilogue(lev->scheduling_level,p);
+}
+
+static void CBSGHD_task_activate(LEVEL l, PID p)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ ll_gettime(TIME_EXACT, &proc_table[p].request_time);
+
+ /* If idle=1, then we have to discharge the capacities stored in
+ the capacity queue up to the length of the idle interval */
+ if (lev->idle == 1) {
+ TIME interval;
+ struct timespec delta;
+ lev->idle = 0;
+ SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
+ /* length of the idle interval expressed in usec! */
+ interval = TIMESPEC2NANOSEC(&delta) / 1000;
+
+ /* it discharge the available capacities from the capacity queue */
+ while (interval > 0 && lev->queue != NULL) {
+ struct timespec dead;
+ int cap;
+ c_readfirst(&dead, &cap, lev->queue);
+ if (cap > interval) {
+ c_writefirst(dead, cap - interval, lev->queue);
+ interval = 0;
+ }
+ else {
+ interval -= cap;
+ c_extractfirst(&lev->queue);
+ }
+ }
+ }
+
+ CBSGHD_activation(lev, p, &proc_table[p].request_time);
+
+
+ /* check the constraint on the maximum period permitted... */
+ if (lev->act_period[p] > lev->maxperiod[p]) {
+ kern_printf("Deadline miss(task_activ.! process:%d act_period:%lu maxperiod:%lu\n",
+ p, lev->act_period[p], lev->maxperiod[p]);
+ kern_raise(XDEADLINE_MISS,p);
+ }
+
+ /* Set the reactivation timer */
+ TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbsghd_dline[p]);
+ lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
+ CBSGHD_timer_reactivate,
+ (void *)p);
+
+ // kern_printf("act : %d %d |",lev->cbsghd_dline[p].tv_nsec/1000,p);
+}
+
+static void CBSGHD_task_insert(LEVEL l, PID p)
+{
+ printk("CBSGHD_task_insert\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+static void CBSGHD_task_extract(LEVEL l, PID p)
+{
+ printk("CBSGHD_task_extract\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+static void CBSGHD_task_endcycle(LEVEL l, PID p)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ struct timespec act_time, res;
+
+ /* It computes the response time of the current instance... */
+ ll_gettime(TIME_EXACT, &act_time);
+ SUBTIMESPEC(&act_time, &proc_table[p].request_time, &res);
+ /* response time expressed in usec! */
+ lev->last_response_time[p] = TIMESPEC2NANOSEC(&res) / 1000;
+
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level,p);
+
+
+ /* A spare capacity is inserted in the capacity queue!! */
+ if (proc_table[p].avail_time > 0) {
+ c_insert(lev->cbsghd_dline[p], proc_table[p].avail_time, &lev->queue, p);
+ proc_table[p].avail_time = 0;
+ }
+
+
+ proc_table[p].status = CBSGHD_IDLE;
+}
+
+static void CBSGHD_task_end(LEVEL l, PID p)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+
+ /* check if the capacity became negative... */
+ /* there is a while because if the wcet is << than the system tick
+ we need to postpone the deadline many times */
+ while (proc_table[p].avail_time < 0) {
+ /* the CBSGHD rule for recharging the capacity */
+ proc_table[p].avail_time += lev->cnormal[p];
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
+ }
+
+ level_table[ lev->scheduling_level ]->
+ guest_end(lev->scheduling_level,p);
+
+ /* we delete the reactivation timer */
+ event_delete(lev->reactivation_timer[p]);
+ lev->reactivation_timer[p] = -1;
+
+
+ /* Finally, we post the zombie event. when the end period is reached,
+ the task descriptor and banwidth are freed */
+ proc_table[p].status = CBSGHD_ZOMBIE;
+ lev->reactivation_timer[p] = kern_event_post(&lev->cbsghd_dline[p],
+ CBSGHD_timer_zombie,
+ (void *)p);
+}
+
+static void CBSGHD_task_sleep(LEVEL l, PID p)
+{
+ printk("CBSGHD_task_sleep\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+static void CBSGHD_task_delay(LEVEL l, PID p, TIME usdelay)
+{
+ printk("CBSGHD_task_delay\n");
+ kern_raise(XUNVALID_TASK,p);
+}
+
+
+static int CBSGHD_guest_create(LEVEL l, PID p, TASK_MODEL *m)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
+
+static void CBSGHD_guest_detach(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_dispatch(LEVEL l, PID p, int nostop)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_epilogue(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_activate(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_insert(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_extract(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_endcycle(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_end(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_sleep(LEVEL l, PID p)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+static void CBSGHD_guest_delay(LEVEL l, PID p,DWORD tickdelay)
+{ kern_raise(XUNVALID_GUEST,exec_shadow); }
+
+
+
+
+/* Registration functions */
+
+/*+ Registration function:
+ int flags the init flags ... see CBS.h +*/
+void CBSGHD_register_level(int flags, LEVEL master)
+{
+ LEVEL l; /* the level that we register */
+ CBSGHD_level_des *lev; /* for readableness only */
+ PID i; /* a counter */
+
+ printk("CBSGHD_register_level\n");
+
+ /* request an entry in the level_table */
+ l = level_alloc_descriptor();
+
+ printk(" alloco descrittore %d %d\n",l,sizeof(CBSGHD_level_des));
+
+ /* alloc the space needed for the CBSGHD_level_des */
+ lev = (CBSGHD_level_des *)kern_alloc(sizeof(CBSGHD_level_des));
+
+ printk(" lev=%d\n",(int)lev);
+
+ /* update the level_table with the new entry */
+ level_table[l] = (level_des *)lev;
+
+ /* fill the standard descriptor */
+ strncpy(lev->l.level_name, CBSGHD_LEVELNAME, MAX_LEVELNAME);
+ lev->l.level_code = CBSGHD_LEVEL_CODE;
+ lev->l.level_version = CBSGHD_LEVEL_VERSION;
+
+ lev->l.level_accept_task_model = CBSGHD_level_accept_task_model;
+ lev->l.level_accept_guest_model = CBSGHD_level_accept_guest_model;
+ lev->l.level_status = CBSGHD_level_status;
+ lev->l.level_scheduler = CBSGHD_level_scheduler;
+
+ if (flags & CBSGHD_ENABLE_GUARANTEE)
+ lev->l.level_guarantee = CBSGHD_level_guarantee;
+ else
+ lev->l.level_guarantee = NULL;
+
+ lev->l.task_create = CBSGHD_task_create;
+ lev->l.task_detach = CBSGHD_task_detach;
+ lev->l.task_eligible = CBSGHD_task_eligible;
+ lev->l.task_dispatch = CBSGHD_task_dispatch;
+ lev->l.task_epilogue = CBSGHD_task_epilogue;
+ lev->l.task_activate = CBSGHD_task_activate;
+ lev->l.task_insert = CBSGHD_task_insert;
+ lev->l.task_extract = CBSGHD_task_extract;
+ lev->l.task_endcycle = CBSGHD_task_endcycle;
+ lev->l.task_end = CBSGHD_task_end;
+ lev->l.task_sleep = CBSGHD_task_sleep;
+ lev->l.task_delay = CBSGHD_task_delay;
+
+ lev->l.guest_create = CBSGHD_guest_create;
+ lev->l.guest_detach = CBSGHD_guest_detach;
+ lev->l.guest_dispatch = CBSGHD_guest_dispatch;
+ lev->l.guest_epilogue = CBSGHD_guest_epilogue;
+ lev->l.guest_activate = CBSGHD_guest_activate;
+ lev->l.guest_insert = CBSGHD_guest_insert;
+ lev->l.guest_extract = CBSGHD_guest_extract;
+ lev->l.guest_endcycle = CBSGHD_guest_endcycle;
+ lev->l.guest_end = CBSGHD_guest_end;
+ lev->l.guest_sleep = CBSGHD_guest_sleep;
+ lev->l.guest_delay = CBSGHD_guest_delay;
+
+ /* fill the CBSGHD descriptor part */
+ for (i=0; i<MAX_PROC; i++) {
+ NULL_TIMESPEC(&lev->cbsghd_dline[i]);
+ lev->period[i] = 0;
+ lev->last_response_time[i] = 0;
+ NULL_TIMESPEC(&lev->reactivation_time[i]);
+ lev->reactivation_timer[i] = -1;
+ }
+
+
+ lev->U = 0;
+ lev->idle = 0;
+ lev->queue = NULL;
+
+ lev->scheduling_level = master;
+
+ lev->flags = flags & 0x07;
+}
+
+
+int CBSGHD_get_response_time(LEVEL l, PID p)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ return lev->last_response_time[p];
+}
+
+
+bandwidth_t CBSGHD_usedbandwidth(LEVEL l)
+{
+ CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
+ if (lev->l.level_code == CBSGHD_LEVEL_CODE &&
+ lev->l.level_version == CBSGHD_LEVEL_VERSION)
+ return lev->U;
+ else
+ return 0;
+}
+
Index: branches/pj/cash/testcash.c
===================================================================
--- branches/pj/cash/testcash.c (nonexistent)
+++ branches/pj/cash/testcash.c (revision 1085)
@@ -0,0 +1,455 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: testcash.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ testcash.c
+ test for the CASH Module, directly derived from Test Number 13 (D)
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "cash.h"
+#include <math.h>
+#include <string.h>
+
+#define ASTER_LIM 60
+#define DISPLAY_MAX 15
+
+#define STAT_Y 9
+
+#define INPUT 0.5
+
+
+
+#define MAX_STAT 10000
+#define RVAL 1
+#define XVAL 2
+#define DVAL 3
+
+
+struct statistic {
+ TIME r_time;
+ TIME ex_time;
+ long dead_post;
+};
+
+
+
+ struct statistic stat[MAX_STAT];
+ TIME val[MAX_STAT];
+
+int n_stat = 0;
+
+TASK hard_asteroide(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+ double avg, l, fix, u;
+ double wcet = 40200;
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'H'; s[1] = 0;
+ /* exponential distribution parameters */
+ fix = wcet - 10.0/9.0 * wcet * (1 - INPUT);
+ avg = 1.0/9.0 * wcet * (1 - INPUT);
+ l = 10.0 / 9.0 * wcet * (1 - INPUT);
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ /* exponential distribution */
+ u = (double)rand();
+
+ u = u / (double)RAND_MAX;
+
+ u = -avg * log(u);
+ if (u > l)
+ u = avg;
+
+
+ load1 = fix + u;
+
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK hard_asteroide1(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'H'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 40000 + rand()%20000;
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK hard_asteroide2(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'H'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 80500; // + rand()%6000;
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+TASK hard_asteroide3(void)
+{
+ int i;
+ int y = rand() % 7 + 1;
+
+ int load1,j;
+
+ char s[2];
+
+ s[0] = 'T'; s[1] = 0;
+
+ for (;;) {
+ i = 1;
+ while (i < ASTER_LIM) {
+ load1 = 27000;
+ for (j=0; j<load1; j++) {
+ puts_xy(i,y,rand()%15+1,s);
+ }
+ //kern_cli();
+ //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
+ //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
+ //kern_sti();
+ //n_stat++;
+ task_endcycle();
+ puts_xy(i,y,WHITE," ");
+ i++;
+ }
+ }
+}
+
+
+TASK clock()
+{
+ int s = 0, m = 0;
+
+ while(1) {
+ printf_xy(62,1,WHITE,"%2d:%2d",m,s);
+ printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
+ printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBSGHD_usedbandwidth(1));
+ task_endcycle();
+
+ if (++s > 59) {
+ s = 0;
+ m++;
+ }
+ printf_xy(62,1,WHITE,"%2d:%2d",m,s);
+ printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
+ printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
+ printf_xy(62,4,WHITE,"Ucbs=%12u",CBSGHD_usedbandwidth(1));
+ task_endcycle();
+ }
+}
+
+
+
+/* we consider the first ASTER_MAX + 2 tasks from the PID 2
+ and plot on the screen the elapsed times... */
+TASK jetcontrol()
+{
+ int i; /* a counter */
+ TIME sum, max, curr, last[5];
+ int nact;
+ int j; /* the elements set by jet_gettable */
+ PID p;
+
+
+ kern_cli();
+ printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
+ kern_sti();
+
+ for (;;) {
+ for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
+ if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
+
+ for (j=0; j<5; j++) last[j] = 0;
+ jet_gettable(p, &last[0], 5);
+ kern_cli();
+ printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6ld ³ %-6ld ³ %-4d ³ %-7ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld", p, sum/(nact==0 ? 1 : nact), max,
+ nact, curr, last[0], last[1], last[2], last[3], last[4]);
+ kern_sti();
+ i++;
+ }
+ task_endcycle();
+ }
+}
+
+
+void save_stat(struct statistic p[], int n, char *name, int type)
+{
+ DOS_FILE *f;
+ int i;
+ char outstring[500];
+
+
+ for(i = 0; i < 500; i++)
+ outstring[i] = '0';
+
+ f = DOS_fopen(name, "w");
+ if (!f) {
+ cprintf("Cannot open %s!!!", name);
+ goto end1;
+ }
+
+ for(i = 0; i < n; i++) {
+ if (type == RVAL)
+ val[i] = p[i].r_time;
+ if (type == XVAL)
+ val[i] = p[i].ex_time;
+ if (type == DVAL)
+ val[i] = p[i].dead_post;
+ }
+
+ memset(outstring, 0, 300);
+ sprintf(outstring, "%ld \n", (long int)n);
+ cprintf("%s", outstring);
+ DOS_fwrite(outstring, 1, strlen(outstring), f);
+
+ for(i = 0; i < n; i++) {
+ memset(outstring, 0, 300);
+ sprintf(outstring, "%ld %lu\n", (long int)i, val[i]);
+ //cprintf("%s", outstring);
+ DOS_fwrite(outstring, 1, strlen(outstring), f);
+ }
+ DOS_fclose(f);
+end1:cprintf("OK?");
+}
+
+
+void result_save(void *p)
+{
+ save_stat(stat, n_stat, "stat1.tim", RVAL);
+}
+
+
+void fine()
+{
+ sys_end();
+}
+
+int main(int argc, char **argv)
+{
+ PID p1,p2,p3, p4, p5, p6, p7;
+
+ ELASTIC_HARD_TASK_MODEL m;
+ // int i;
+ struct timespec fineprg;
+
+
+ //sys_atrunlevel(result_save, NULL, RUNLEVEL_AFTER_EXIT);
+ srand(7);
+
+ elastic_hard_task_default_model(m);
+ elastic_hard_task_def_wcet(m,500);
+ elastic_hard_task_def_maxperiod(m,500000);
+ elastic_hard_task_def_cnormal(m,500);
+ elastic_hard_task_def_period(m,500000);
+ elastic_hard_task_def_group(m,1);
+ elastic_hard_task_def_ctrl_jet(m);
+
+
+ p1 = task_create("Clock",clock,&m,NULL);
+ if (p1 == -1) {
+ perror("testhd.c(main): Could not create task <Clock> ...");
+ sys_end();
+ }
+
+
+
+
+ elastic_hard_task_def_wcet(m,1000);
+ elastic_hard_task_def_maxperiod(m,100000);
+ elastic_hard_task_def_cnormal(m,1000);
+ elastic_hard_task_def_period(m,100000);
+
+
+ p2 = task_create("JetControl",jetcontrol,&m,NULL);
+ if (p2 == -1) {
+ perror("testhd.c(main): Could not create task <JetControl> ...");
+ sys_end();
+ }
+
+
+
+ elastic_hard_task_def_wcet(m,21000);
+ elastic_hard_task_def_maxperiod(m,155000);
+ elastic_hard_task_def_cnormal(m,21000);
+ elastic_hard_task_def_period(m,155000);
+
+
+ p3 = task_create("Hard_asteroide1",hard_asteroide1,&m,NULL);
+ if (p3 == -1) {
+ perror("testhd.c(main): Could not create task <Hard asteroide> ...");
+ sys_end();
+ }
+
+ elastic_hard_task_def_wcet(m,12000);
+ elastic_hard_task_def_maxperiod(m,61000);
+ elastic_hard_task_def_cnormal(m,12000);
+ elastic_hard_task_def_period(m,61000);
+
+
+
+
+ p4 = task_create("Hard_asteroide2",hard_asteroide,&m,NULL);
+ if (p4 == -1) {
+ perror("testhd.c(main): Could not create task <Hard asteroide> ...");
+ sys_end();
+ }
+
+
+ elastic_hard_task_def_wcet(m,30000);
+ elastic_hard_task_def_maxperiod(m,200000);
+ elastic_hard_task_def_cnormal(m,30000);
+ elastic_hard_task_def_period(m,200000);
+
+
+ p5 = task_create("Hard_asteroide3",hard_asteroide2,&m,NULL);
+ if (p5 == -1) {
+ perror("testhd.c(main): Could not create task <Hard asteroide> ...");
+ sys_end();
+ }
+
+ elastic_hard_task_def_wcet(m,30000);
+ elastic_hard_task_def_maxperiod(m,100000);
+ elastic_hard_task_def_cnormal(m,30000);
+ elastic_hard_task_def_period(m,100000);
+
+
+ p6 = task_create("Hard_asteroide3",hard_asteroide2,&m,NULL);
+ if (p6 == -1) {
+ perror("testhd.c(main): Could not create task <Hard asteroide> ...");
+ sys_end();
+ }
+
+ elastic_hard_task_def_wcet(m,10000);
+ elastic_hard_task_def_maxperiod(m,200000);
+ elastic_hard_task_def_cnormal(m,2500);
+ elastic_hard_task_def_period(m,49000);
+
+
+ p7 = task_create("Hard_asteroide3",hard_asteroide3,&m,NULL);
+ if (p7 == -1) {
+ perror("testhd.c(main): Could not create task <Hard asteroide> ...");
+ sys_end();
+ }
+
+
+
+
+ printf_xy(0,STAT_Y + 15,WHITE,"Hard asteroide PID= %-3d ",p3);
+ printf_xy(0,STAT_Y + 17,WHITE,"Clock PID= %-3d ",p1);
+ printf_xy(0,STAT_Y + 18,WHITE,"JetControl PID= %-3d ",p2);
+
+
+
+ task_nopreempt();
+ fineprg.tv_sec = 30;
+ fineprg.tv_nsec = 0;
+ kern_event_post(&fineprg,fine,NULL);
+ group_activate(1);
+ return 0;
+}
+
Index: branches/pj/cash/initcash.c
===================================================================
--- branches/pj/cash/initcash.c (nonexistent)
+++ branches/pj/cash/initcash.c (revision 1085)
@@ -0,0 +1,128 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initcash.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ System initialization file
+
+ The tick is set to TICK ms.
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBSHD (Constant Bandwidth Server with Hard Deadlines) level
+ a Dummy level
+
+
+
+
+ It can accept these task models (into () the mandatory fields):
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ NRT_TASK_MODEL at level 1
+ ELASTIC_HARD_TASK_MODEL (cnormal,period,wcet,maxperiod) at level 5
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/tbs.h"
+#include "modules/cbs.h"
+#include "cash.h"
+#include "modules/dummy.h"
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 300
+
+#define RRTICK 5000
+
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBSGHD_register_level(CBSGHD_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ /* CBS_register_level(CBS_ENABLE_ALL, 0); */
+ //CBSHD_register_level(CBSHD_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ HARTPORT_init();
+
+ KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
+
+
+
+
+
+
+
+
+
Index: branches/pj/cash/cash.h
===================================================================
--- branches/pj/cash/cash.h (nonexistent)
+++ branches/pj/cash/cash.h (revision 1085)
@@ -0,0 +1,176 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: cash.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2002-09-02 09:37:41 $
+ ------------
+
+ This file contains the server CBSHD (CASH Algorithm)
+
+ Title:
+ CBSHD (Constant Bandwidth Server with hard deadlines)
+
+ Task Models Accepted:
+ ELASTIC_HARD_TASK_MODEL - Elastic Hard Tasks
+ wcet field must be != 0
+ cnormal field must be != 0
+ period field must be != 0
+
+ Description:
+ This module schedule his tasks following the CBSHD scheme.
+ (see Marco Caccamo, Giorgio Buttazzo and Lui Sha
+ "Elastic Feedback Control"
+ Proceedings of the EUROMICRO 2000)
+
+ The tasks are inserted in an EDF level (or similar) with a JOB_TASK_MODEL,
+ and the CBSHD level expects that the task is scheduled with the absolute
+ deadline passed in the model.
+
+ The task guarantee is based on the factor utilization approach.
+
+ Exceptions raised:
+ XUNVALID_GUEST
+ This level doesn't support guests. When a guest operation
+ is called, the exception is raised.
+
+ These exceptions are pclass-dependent...
+ XDEADLINE_MISS
+ If a task miss his deadline, the exception is raised.
+
+ Restrictions & special features:
+ - This level doesn't manage the main task.
+ - At init time we have to specify:
+ . guarantee check
+ (when all task are created the system will check that the task_set
+ will not use more than the available bandwidth)
+ - A function to return the used bandwidth of the level is provided.
+ - A function to return the pending activations of the task.
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#ifndef __CBSGHD_H__
+#define __CBSGHD_H__
+
+#include <ll/ll.h>
+#include <kernel/config.h>
+#include <sys/types.h>
+#include <kernel/types.h>
+#include <modules/codes.h>
+
+
+
+
+
+
+
+
+/*+ flags... +*/
+#define CBSGHD_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
+#define CBSGHD_ENABLE_ALL 1
+
+#define CBSGHD_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
+ in EDF_register_level... +*/
+
+
+
+
+
+#define ELASTIC_HARD_PCLASS 0x0600
+
+#define CBSGHD_LEVELNAME "CBSGHD base"
+#define CBSGHD_LEVEL_CODE 106
+#define CBSGHD_LEVEL_VERSION 1
+
+
+/* -----------------------------------------------------------------------
+ ELASTIC_HARD_TASK_MODEL: elastic hard Tasks
+ ----------------------------------------------------------------------- */
+
+
+typedef struct {
+ TASK_MODEL t;
+ TIME cnormal;
+ TIME period;
+ TIME wcet;
+ TIME maxperiod;
+} ELASTIC_HARD_TASK_MODEL;
+
+#define elastic_hard_task_default_model(m) \
+ task_default_model((m).t,ELASTIC_HARD_PCLASS), \
+ (m).cnormal = 0, \
+ (m).period = 0, \
+ (m).wcet = 0, \
+ (m).maxperiod = 0
+#define elastic_hard_task_def_level(m,l) task_def_level((m).t,l)
+#define elastic_hard_task_def_arg(m,a) task_def_arg((m).t,a)
+#define elastic_hard_task_def_stack(m,s) task_def_stack((m).t,s)
+#define elastic_hard_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
+#define elastic_hard_task_def_group(m,g) task_def_group((m).t,g)
+#define elastic_hard_task_def_usemath(m) task_def_usemath((m).t)
+#define elastic_hard_task_def_system(m) task_def_system((m).t)
+#define elastic_hard_task_def_nokill(m) task_def_nokill((m).t)
+#define elastic_hard_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
+#define elastic_hard_task_def_cnormal(m,c) (m).cnormal = (c)
+#define elastic_hard_task_def_period(m,p) (m).period = (p)
+#define elastic_hard_task_def_wcet(m,w) (m).wcet = (w)
+#define elastic_hard_task_def_maxperiod(m,p) (m).maxperiod = (p)
+#define elastic_hard_task_def_joinable(m) task_def_joinable((m).t)
+#define elastic_hard_task_def_unjoinable(m) task_def_unjoinable((m).t)
+
+
+
+
+/*+ Registration function:
+ int flags Options to be used in this level instance...
+ LEVEL master the level that must be used as master level for the
+ CBSGHD tasks
++*/
+void CBSGHD_register_level(int flags, LEVEL master);
+
+/*+ Returns the used bandwidth of a level +*/
+bandwidth_t CBSGHD_usedbandwidth(LEVEL l);
+
+#endif
+
Index: branches/pj/cash/readme.txt
===================================================================
--- branches/pj/cash/readme.txt (nonexistent)
+++ branches/pj/cash/readme.txt (revision 1085)
@@ -0,0 +1,6 @@
+This Example has been made by Marco Caccamo.
+
+There is not a lot of documentation available, so if you have problems please
+send an e-mail to Marco ( http://gandalf.sssup.it/~caccamo/ )
+
+Paolo
Index: branches/pj/cash/makefile
===================================================================
--- branches/pj/cash/makefile (nonexistent)
+++ branches/pj/cash/makefile (revision 1085)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+
+include $(BASE)/config/config.mk
+
+PROGS=testcash
+
+include $(BASE)/config/example.mk
+
+testcash:
+ make -f $(SUBMAKE) APP=testcash INIT= OTHEROBJS="initcash.o cash.o" OTHERINCL=